{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "bb56c35b",
   "metadata": {},
   "source": [
    "# 股票预测 - 每个股票单独训练LightGBM模型"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "efa657ed",
   "metadata": {},
   "source": [
    "## 导库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6dc64c05",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import os\n",
    "import numpy as np\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import mean_squared_error\n",
    "import lightgbm as lgb\n",
    "import joblib\n",
    "import warnings\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.rcParams[\"font.sans-serif\"] = [\"SimHei\"]\n",
    "plt.rcParams[\"axes.unicode_minus\"] = False\n",
    "\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30f9e7e7",
   "metadata": {},
   "source": [
    "## 参数配置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2579540f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据目录: ./../../data\n",
      "输出目录: ./../../output\n",
      "模型目录: ./../../model\n",
      "序列长度: 10\n",
      "LightGBM参数: {'objective': 'regression', 'metric': 'mse', 'boosting_type': 'gbdt', 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.9, 'bagging_fraction': 0.8, 'bagging_freq': 5, 'verbose': -1, 'random_state': 42, 'n_estimators': 100}\n"
     ]
    }
   ],
   "source": [
    "DATA_DIR = \"./../../data\"\n",
    "OUTPUT_DIR = \"./../../output\"\n",
    "MODEL_DIR = \"./../../model\"\n",
    "\n",
    "# LightGBM模型参数配置\n",
    "seq_len = 10  # 序列长度，用于构造时间窗口特征\n",
    "lgb_params = {\n",
    "    \"objective\": \"regression\",\n",
    "    \"metric\": \"mse\",\n",
    "    \"boosting_type\": \"gbdt\",\n",
    "    \"num_leaves\": 31,\n",
    "    \"learning_rate\": 0.05,\n",
    "    \"feature_fraction\": 0.9,\n",
    "    \"bagging_fraction\": 0.8,\n",
    "    \"bagging_freq\": 5,\n",
    "    \"verbose\": -1,\n",
    "    \"random_state\": 42,\n",
    "    \"n_estimators\": 100,\n",
    "}\n",
    "\n",
    "print(f\"数据目录: {DATA_DIR}\")\n",
    "print(f\"输出目录: {OUTPUT_DIR}\")\n",
    "print(f\"模型目录: {MODEL_DIR}\")\n",
    "print(f\"序列长度: {seq_len}\")\n",
    "print(f\"LightGBM参数: {lgb_params}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "942242cc",
   "metadata": {},
   "source": [
    "## 数据加载"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ce2d3c33",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据形状: (635729, 12)\n",
      "股票数量: 300\n"
     ]
    },
    {
     "data": {
      "application/vnd.microsoft.datawrangler.viewer.v0+json": {
       "columns": [
        {
         "name": "index",
         "rawType": "int64",
         "type": "integer"
        },
        {
         "name": "StockCode",
         "rawType": "int64",
         "type": "integer"
        },
        {
         "name": "Date",
         "rawType": "object",
         "type": "string"
        },
        {
         "name": "Open",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "Close",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "High",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "Low",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "Volume",
         "rawType": "int64",
         "type": "integer"
        },
        {
         "name": "Turnover",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "Amplitude",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "PriceChange",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "TurnoverRate",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "PriceChangePercentage",
         "rawType": "float64",
         "type": "float"
        }
       ],
       "ref": "d4d8ffdb-bfbd-4499-9bdf-7912910ec0bf",
       "rows": [
        [
         "0",
         "600000",
         "2015-04-20",
         "9.47",
         "8.89",
         "9.47",
         "8.68",
         "5724358",
         "10446728448.0",
         "8.42",
         "-0.49",
         "3.84",
         "-5.22"
        ],
        [
         "1",
         "600000",
         "2015-04-21",
         "8.79",
         "9.07",
         "9.1",
         "8.79",
         "3681947",
         "6615540736.0",
         "3.49",
         "0.18",
         "2.47",
         "2.02"
        ],
        [
         "2",
         "600000",
         "2015-04-22",
         "9.17",
         "9.31",
         "9.35",
         "9.02",
         "4207667",
         "7712130816.0",
         "3.64",
         "0.24",
         "2.82",
         "2.65"
        ]
       ],
       "shape": {
        "columns": 12,
        "rows": 3
       }
      },
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>StockCode</th>\n",
       "      <th>Date</th>\n",
       "      <th>Open</th>\n",
       "      <th>Close</th>\n",
       "      <th>High</th>\n",
       "      <th>Low</th>\n",
       "      <th>Volume</th>\n",
       "      <th>Turnover</th>\n",
       "      <th>Amplitude</th>\n",
       "      <th>PriceChange</th>\n",
       "      <th>TurnoverRate</th>\n",
       "      <th>PriceChangePercentage</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>600000</td>\n",
       "      <td>2015-04-20</td>\n",
       "      <td>9.47</td>\n",
       "      <td>8.89</td>\n",
       "      <td>9.47</td>\n",
       "      <td>8.68</td>\n",
       "      <td>5724358</td>\n",
       "      <td>1.044673e+10</td>\n",
       "      <td>8.42</td>\n",
       "      <td>-0.49</td>\n",
       "      <td>3.84</td>\n",
       "      <td>-5.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>600000</td>\n",
       "      <td>2015-04-21</td>\n",
       "      <td>8.79</td>\n",
       "      <td>9.07</td>\n",
       "      <td>9.10</td>\n",
       "      <td>8.79</td>\n",
       "      <td>3681947</td>\n",
       "      <td>6.615541e+09</td>\n",
       "      <td>3.49</td>\n",
       "      <td>0.18</td>\n",
       "      <td>2.47</td>\n",
       "      <td>2.02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>600000</td>\n",
       "      <td>2015-04-22</td>\n",
       "      <td>9.17</td>\n",
       "      <td>9.31</td>\n",
       "      <td>9.35</td>\n",
       "      <td>9.02</td>\n",
       "      <td>4207667</td>\n",
       "      <td>7.712131e+09</td>\n",
       "      <td>3.64</td>\n",
       "      <td>0.24</td>\n",
       "      <td>2.82</td>\n",
       "      <td>2.65</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   StockCode        Date  Open  Close  High   Low   Volume      Turnover  \\\n",
       "0     600000  2015-04-20  9.47   8.89  9.47  8.68  5724358  1.044673e+10   \n",
       "1     600000  2015-04-21  8.79   9.07  9.10  8.79  3681947  6.615541e+09   \n",
       "2     600000  2015-04-22  9.17   9.31  9.35  9.02  4207667  7.712131e+09   \n",
       "\n",
       "   Amplitude  PriceChange  TurnoverRate  PriceChangePercentage  \n",
       "0       8.42        -0.49          3.84                  -5.22  \n",
       "1       3.49         0.18          2.47                   2.02  \n",
       "2       3.64         0.24          2.82                   2.65  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv(os.path.join(DATA_DIR, \"train.csv\"))\n",
    "\n",
    "# 列名映射\n",
    "column_mapping = {\n",
    "    \"股票代码\": \"StockCode\",\n",
    "    \"日期\": \"Date\",\n",
    "    \"开盘\": \"Open\",\n",
    "    \"收盘\": \"Close\",\n",
    "    \"最高\": \"High\",\n",
    "    \"最低\": \"Low\",\n",
    "    \"成交量\": \"Volume\",\n",
    "    \"成交额\": \"Turnover\",\n",
    "    \"振幅\": \"Amplitude\",\n",
    "    \"涨跌额\": \"PriceChange\",\n",
    "    \"换手率\": \"TurnoverRate\",\n",
    "    \"涨跌幅\": \"PriceChangePercentage\",\n",
    "}\n",
    "\n",
    "df.rename(columns=column_mapping, inplace=True)\n",
    "print(f\"数据形状: {df.shape}\")\n",
    "print(f\"股票数量: {df['StockCode'].nunique()}\")\n",
    "df.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4bb50ee7",
   "metadata": {},
   "source": [
    "## 特征工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "11e53b42",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "添加技术指标后的特征数量: 25\n",
      "新增技术指标列: ['MA.MA1', 'MA.MA2', 'MA.MA3', 'MA.MA4', 'MA.MA5', 'MA.MA6', 'KDJ.K', 'KDJ.D', 'KDJ.J', 'MACD.DIFF', 'MACD.DEA', 'MACD.MACD', 'CCI.CCI']\n"
     ]
    },
    {
     "data": {
      "application/vnd.microsoft.datawrangler.viewer.v0+json": {
       "columns": [
        {
         "name": "index",
         "rawType": "int64",
         "type": "integer"
        },
        {
         "name": "StockCode",
         "rawType": "int64",
         "type": "integer"
        },
        {
         "name": "Date",
         "rawType": "object",
         "type": "string"
        },
        {
         "name": "Open",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "Close",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "High",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "Low",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "Volume",
         "rawType": "int64",
         "type": "integer"
        },
        {
         "name": "Turnover",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "Amplitude",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "PriceChange",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "TurnoverRate",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "PriceChangePercentage",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MA.MA1",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MA.MA2",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MA.MA3",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MA.MA4",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MA.MA5",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MA.MA6",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "KDJ.K",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "KDJ.D",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "KDJ.J",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MACD.DIFF",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MACD.DEA",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "MACD.MACD",
         "rawType": "float64",
         "type": "float"
        },
        {
         "name": "CCI.CCI",
         "rawType": "float64",
         "type": "float"
        }
       ],
       "ref": "1cc5cba0-ac29-4708-a48f-55cb9dd62077",
       "rows": [
        [
         "0",
         "600000",
         "2015-04-20",
         "9.47",
         "8.89",
         "9.47",
         "8.68",
         "5724358",
         "10446728448.0",
         "8.42",
         "-0.49",
         "3.84",
         "-5.22",
         "9.026",
         "9.055",
         "8.661",
         "8.665666666666668",
         "8.662",
         "8.147583333333333",
         "26.582278481012732",
         "26.582278481012732",
         "26.58227848101273",
         "0.0",
         "0.0",
         "0.0",
         "-66.66666666666667"
        ],
        [
         "1",
         "600000",
         "2015-04-21",
         "8.79",
         "9.07",
         "9.1",
         "8.79",
         "3681947",
         "6615540736.0",
         "3.49",
         "0.18",
         "2.47",
         "2.02",
         "9.026",
         "9.055",
         "8.661",
         "8.665666666666668",
         "8.662",
         "8.147583333333333",
         "34.17721518987347",
         "29.11392405063298",
         "44.30379746835446",
         "0.019393939393937742",
         "0.0038787878787875487",
         "0.03103030303030039",
         "-66.66666666666667"
        ],
        [
         "2",
         "600000",
         "2015-04-22",
         "9.17",
         "9.31",
         "9.35",
         "9.02",
         "4207667",
         "7712130816.0",
         "3.64",
         "0.24",
         "2.82",
         "2.65",
         "9.026",
         "9.055",
         "8.661",
         "8.665666666666668",
         "8.662",
         "8.147583333333333",
         "49.36708860759497",
         "35.864978902953645",
         "76.37130801687762",
         "0.059683705744308924",
         "0.015039771451891823",
         "0.0892878685848342",
         "100.00000000000058"
        ]
       ],
       "shape": {
        "columns": 25,
        "rows": 3
       }
      },
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>StockCode</th>\n",
       "      <th>Date</th>\n",
       "      <th>Open</th>\n",
       "      <th>Close</th>\n",
       "      <th>High</th>\n",
       "      <th>Low</th>\n",
       "      <th>Volume</th>\n",
       "      <th>Turnover</th>\n",
       "      <th>Amplitude</th>\n",
       "      <th>PriceChange</th>\n",
       "      <th>...</th>\n",
       "      <th>MA.MA4</th>\n",
       "      <th>MA.MA5</th>\n",
       "      <th>MA.MA6</th>\n",
       "      <th>KDJ.K</th>\n",
       "      <th>KDJ.D</th>\n",
       "      <th>KDJ.J</th>\n",
       "      <th>MACD.DIFF</th>\n",
       "      <th>MACD.DEA</th>\n",
       "      <th>MACD.MACD</th>\n",
       "      <th>CCI.CCI</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>600000</td>\n",
       "      <td>2015-04-20</td>\n",
       "      <td>9.47</td>\n",
       "      <td>8.89</td>\n",
       "      <td>9.47</td>\n",
       "      <td>8.68</td>\n",
       "      <td>5724358</td>\n",
       "      <td>1.044673e+10</td>\n",
       "      <td>8.42</td>\n",
       "      <td>-0.49</td>\n",
       "      <td>...</td>\n",
       "      <td>8.665667</td>\n",
       "      <td>8.662</td>\n",
       "      <td>8.147583</td>\n",
       "      <td>26.582278</td>\n",
       "      <td>26.582278</td>\n",
       "      <td>26.582278</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-66.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>600000</td>\n",
       "      <td>2015-04-21</td>\n",
       "      <td>8.79</td>\n",
       "      <td>9.07</td>\n",
       "      <td>9.10</td>\n",
       "      <td>8.79</td>\n",
       "      <td>3681947</td>\n",
       "      <td>6.615541e+09</td>\n",
       "      <td>3.49</td>\n",
       "      <td>0.18</td>\n",
       "      <td>...</td>\n",
       "      <td>8.665667</td>\n",
       "      <td>8.662</td>\n",
       "      <td>8.147583</td>\n",
       "      <td>34.177215</td>\n",
       "      <td>29.113924</td>\n",
       "      <td>44.303797</td>\n",
       "      <td>0.019394</td>\n",
       "      <td>0.003879</td>\n",
       "      <td>0.031030</td>\n",
       "      <td>-66.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>600000</td>\n",
       "      <td>2015-04-22</td>\n",
       "      <td>9.17</td>\n",
       "      <td>9.31</td>\n",
       "      <td>9.35</td>\n",
       "      <td>9.02</td>\n",
       "      <td>4207667</td>\n",
       "      <td>7.712131e+09</td>\n",
       "      <td>3.64</td>\n",
       "      <td>0.24</td>\n",
       "      <td>...</td>\n",
       "      <td>8.665667</td>\n",
       "      <td>8.662</td>\n",
       "      <td>8.147583</td>\n",
       "      <td>49.367089</td>\n",
       "      <td>35.864979</td>\n",
       "      <td>76.371308</td>\n",
       "      <td>0.059684</td>\n",
       "      <td>0.015040</td>\n",
       "      <td>0.089288</td>\n",
       "      <td>100.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 25 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   StockCode        Date  Open  Close  High   Low   Volume      Turnover  \\\n",
       "0     600000  2015-04-20  9.47   8.89  9.47  8.68  5724358  1.044673e+10   \n",
       "1     600000  2015-04-21  8.79   9.07  9.10  8.79  3681947  6.615541e+09   \n",
       "2     600000  2015-04-22  9.17   9.31  9.35  9.02  4207667  7.712131e+09   \n",
       "\n",
       "   Amplitude  PriceChange  ...    MA.MA4  MA.MA5    MA.MA6      KDJ.K  \\\n",
       "0       8.42        -0.49  ...  8.665667   8.662  8.147583  26.582278   \n",
       "1       3.49         0.18  ...  8.665667   8.662  8.147583  34.177215   \n",
       "2       3.64         0.24  ...  8.665667   8.662  8.147583  49.367089   \n",
       "\n",
       "       KDJ.D      KDJ.J  MACD.DIFF  MACD.DEA  MACD.MACD     CCI.CCI  \n",
       "0  26.582278  26.582278   0.000000  0.000000   0.000000  -66.666667  \n",
       "1  29.113924  44.303797   0.019394  0.003879   0.031030  -66.666667  \n",
       "2  35.864979  76.371308   0.059684  0.015040   0.089288  100.000000  \n",
       "\n",
       "[3 rows x 25 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 添加技术指标特征\n",
    "# 计算移动平均线 (MA)\n",
    "df[\"MA.MA1\"] = df.groupby(\"StockCode\")[\"Close\"].transform(\n",
    "    lambda x: x.rolling(window=5).mean()\n",
    ")\n",
    "df[\"MA.MA2\"] = df.groupby(\"StockCode\")[\"Close\"].transform(\n",
    "    lambda x: x.rolling(window=10).mean()\n",
    ")\n",
    "df[\"MA.MA3\"] = df.groupby(\"StockCode\")[\"Close\"].transform(\n",
    "    lambda x: x.rolling(window=20).mean()\n",
    ")\n",
    "df[\"MA.MA4\"] = df.groupby(\"StockCode\")[\"Close\"].transform(\n",
    "    lambda x: x.rolling(window=30).mean()\n",
    ")\n",
    "df[\"MA.MA5\"] = df.groupby(\"StockCode\")[\"Close\"].transform(\n",
    "    lambda x: x.rolling(window=60).mean()\n",
    ")\n",
    "df[\"MA.MA6\"] = df.groupby(\"StockCode\")[\"Close\"].transform(\n",
    "    lambda x: x.rolling(window=120).mean()\n",
    ")\n",
    "\n",
    "\n",
    "# 计算KDJ指标\n",
    "def calculate_kdj(data, n=10, m1=3, m2=3):\n",
    "    data = data.copy()\n",
    "    low_list = data[\"Low\"].rolling(window=n, min_periods=1).min()\n",
    "    high_list = data[\"High\"].rolling(window=n, min_periods=1).max()\n",
    "\n",
    "    rsv = (data[\"Close\"] - low_list) / (high_list - low_list) * 100\n",
    "    data[\"KDJ.K\"] = rsv.ewm(alpha=1 / m1, adjust=False).mean()\n",
    "    data[\"KDJ.D\"] = data[\"KDJ.K\"].ewm(alpha=1 / m2, adjust=False).mean()\n",
    "    data[\"KDJ.J\"] = 3 * data[\"KDJ.K\"] - 2 * data[\"KDJ.D\"]\n",
    "    return data\n",
    "\n",
    "\n",
    "# 按股票代码分组计算KDJ\n",
    "for stock_code, group in df.groupby(\"StockCode\"):\n",
    "    kdj_data = calculate_kdj(group)\n",
    "    df.loc[kdj_data.index, [\"KDJ.K\", \"KDJ.D\", \"KDJ.J\"]] = kdj_data[\n",
    "        [\"KDJ.K\", \"KDJ.D\", \"KDJ.J\"]\n",
    "    ]\n",
    "\n",
    "\n",
    "# 计算MACD指标\n",
    "def calculate_macd(data, short_window=10, long_window=26, signal_window=9):\n",
    "    data = data.copy()\n",
    "    data[\"MACD.DIFF\"] = (\n",
    "        data[\"Close\"].ewm(span=short_window, adjust=False).mean()\n",
    "        - data[\"Close\"].ewm(span=long_window, adjust=False).mean()\n",
    "    )\n",
    "    data[\"MACD.DEA\"] = data[\"MACD.DIFF\"].ewm(span=signal_window, adjust=False).mean()\n",
    "    data[\"MACD.MACD\"] = 2 * (data[\"MACD.DIFF\"] - data[\"MACD.DEA\"])\n",
    "    return data\n",
    "\n",
    "\n",
    "# 按股票代码分组计算MACD\n",
    "for stock_code, group in df.groupby(\"StockCode\"):\n",
    "    macd_data = calculate_macd(group)\n",
    "    df.loc[macd_data.index, [\"MACD.DIFF\", \"MACD.DEA\", \"MACD.MACD\"]] = macd_data[\n",
    "        [\"MACD.DIFF\", \"MACD.DEA\", \"MACD.MACD\"]\n",
    "    ]\n",
    "\n",
    "\n",
    "# 计算CCI指标\n",
    "def calculate_cci(data, n=10):\n",
    "    data = data.copy()\n",
    "    tp = (data[\"High\"] + data[\"Low\"] + data[\"Close\"]) / 3\n",
    "    ma = tp.rolling(window=n, min_periods=1).mean()\n",
    "    md = tp.rolling(window=n, min_periods=1).apply(lambda x: abs(x - x.mean()).mean())\n",
    "    data[\"CCI.CCI\"] = (tp - ma) / (0.015 * md)\n",
    "    return data\n",
    "\n",
    "\n",
    "# 按股票代码分组计算CCI\n",
    "for stock_code, group in df.groupby(\"StockCode\"):\n",
    "    cci_data = calculate_cci(group)\n",
    "    df.loc[cci_data.index, [\"CCI.CCI\"]] = cci_data[[\"CCI.CCI\"]]\n",
    "\n",
    "# 填充NaN值\n",
    "df.fillna(method=\"bfill\", inplace=True)\n",
    "df.fillna(method=\"ffill\", inplace=True)\n",
    "df.fillna(0, inplace=True)\n",
    "\n",
    "# 显示添加技术指标后的数据预览\n",
    "print(\"添加技术指标后的特征数量:\", len(df.columns))\n",
    "print(\"新增技术指标列:\", df.columns[-13:].tolist())\n",
    "df.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "24637cf3",
   "metadata": {},
   "source": [
    "## LightGBM特征构造函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "34a00027",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LightGBM特征构造函数定义完成！\n"
     ]
    }
   ],
   "source": [
    "def create_lgb_features(stock_data, seq_length, features):\n",
    "    \"\"\"\n",
    "    为LightGBM创建时间窗口特征\n",
    "    Args:\n",
    "        stock_data: 单个股票的数据\n",
    "        seq_length: 序列长度\n",
    "        features: 特征列名列表\n",
    "    Returns:\n",
    "        X: 特征矩阵\n",
    "        y: 目标变量\n",
    "    \"\"\"\n",
    "    # 按日期排序\n",
    "    stock_data = stock_data.sort_values(\"Date\").reset_index(drop=True)\n",
    "\n",
    "    X_list = []\n",
    "    y_list = []\n",
    "\n",
    "    for i in range(seq_length, len(stock_data)):\n",
    "        # 获取过去seq_length天的特征\n",
    "        window_data = stock_data.iloc[i - seq_length : i][features].values\n",
    "\n",
    "        # 将时间窗口特征展平为一维向量\n",
    "        # 例如: 如果seq_length=10, features=20, 那么特征向量长度为200\n",
    "        X_list.append(window_data.flatten())\n",
    "\n",
    "        # 目标变量是当前时刻的收盘价\n",
    "        y_list.append(stock_data.iloc[i][\"Close\"])\n",
    "\n",
    "    return np.array(X_list), np.array(y_list)\n",
    "\n",
    "\n",
    "def create_prediction_features(stock_data, seq_length, features, scaler):\n",
    "    \"\"\"\n",
    "    为预测阶段创建特征\n",
    "\n",
    "    Args:\n",
    "        stock_data: 单个股票的数据\n",
    "        seq_length: 序列长度\n",
    "        features: 特征列名列表\n",
    "        scaler: 标准化器\n",
    "    Returns:\n",
    "        X: 特征向量\n",
    "    \"\"\"\n",
    "    # 获取最后seq_length条记录\n",
    "    last_records = stock_data.iloc[-seq_length:].copy().reset_index(drop=True)\n",
    "\n",
    "    # 标准化特征（保留收盘价）\n",
    "    backup_close = last_records[\"Close\"].copy()\n",
    "    last_records[features] = scaler.transform(last_records[features])\n",
    "    last_records[\"Close\"] = backup_close\n",
    "\n",
    "    # 提取特征并展平\n",
    "    window_data = last_records[features].values\n",
    "    X = window_data.flatten().reshape(1, -1)\n",
    "\n",
    "    return X"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ec8e8c5",
   "metadata": {},
   "source": [
    "## 每个股票单独训练LightGBM模型"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ad4081d",
   "metadata": {},
   "source": [
    "### 加权平均MSE计算公式\n",
    "\n",
    "为了更准确地评估整体模型性能，我们将按照每个股票的数据点数量进行加权平均：\n",
    "\n",
    "$$\\text{总体MSE} = \\frac{\\sum_{i=1}^N n_i \\cdot \\text{MSE}_i}{\\sum_{i=1}^N n_i}$$\n",
    "\n",
    "其中：\n",
    "- $N$ 是股票总数\n",
    "- $n_i$ 是第 $i$ 支股票的数据点数量  \n",
    "- $\\text{MSE}_i$ 是第 $i$ 支股票LightGBM模型的MSE损失\n",
    "\n",
    "这种方法能够确保数据量大的股票在总体评估中有更大的权重，更准确地反映模型的整体性能。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "911d0d93",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "总共有 300 支股票需要训练\n",
      "\n",
      "==================================================\n",
      "训练股票 600000 (1/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2390, 230), 目标变量形状: (2390,)\n",
      "  特征矩阵形状: (2390, 230), 目标变量形状: (2390,)\n",
      "股票 600000 训练完成，MSE损失: 0.008129\n",
      "数据点数量: 2390, 模型保存至: ./../../model\\lightgbm_model_600000.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600009 (2/300)\n",
      "==================================================\n",
      "股票 600000 训练完成，MSE损失: 0.008129\n",
      "数据点数量: 2390, 模型保存至: ./../../model\\lightgbm_model_600000.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600009 (2/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "股票 600009 训练完成，MSE损失: 0.440587\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_600009.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600010 (3/300)\n",
      "==================================================\n",
      "股票 600009 训练完成，MSE损失: 0.440587\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_600009.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600010 (3/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2413, 230), 目标变量形状: (2413,)\n",
      "  特征矩阵形状: (2413, 230), 目标变量形状: (2413,)\n",
      "股票 600010 训练完成，MSE损失: 0.001223\n",
      "数据点数量: 2413, 模型保存至: ./../../model\\lightgbm_model_600010.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600011 (4/300)\n",
      "==================================================\n",
      "股票 600010 训练完成，MSE损失: 0.001223\n",
      "数据点数量: 2413, 模型保存至: ./../../model\\lightgbm_model_600010.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600011 (4/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600011 训练完成，MSE损失: 0.013267\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600011.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600015 (5/300)\n",
      "==================================================\n",
      "股票 600011 训练完成，MSE损失: 0.013267\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600011.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600015 (5/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600015 训练完成，MSE损失: 0.004736\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600015.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600016 (6/300)\n",
      "==================================================\n",
      "股票 600015 训练完成，MSE损失: 0.004736\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600015.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600016 (6/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600016 训练完成，MSE损失: 0.002354\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600016.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600018 (7/300)\n",
      "==================================================\n",
      "股票 600016 训练完成，MSE损失: 0.002354\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600016.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600018 (7/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "股票 600018 训练完成，MSE损失: 0.006473\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_600018.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600019 (8/300)\n",
      "==================================================\n",
      "股票 600018 训练完成，MSE损失: 0.006473\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_600018.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600019 (8/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2330, 230), 目标变量形状: (2330,)\n",
      "  特征矩阵形状: (2330, 230), 目标变量形状: (2330,)\n",
      "股票 600019 训练完成，MSE损失: 0.011109\n",
      "数据点数量: 2330, 模型保存至: ./../../model\\lightgbm_model_600019.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600023 (9/300)\n",
      "==================================================\n",
      "股票 600019 训练完成，MSE损失: 0.011109\n",
      "数据点数量: 2330, 模型保存至: ./../../model\\lightgbm_model_600019.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600023 (9/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600023 训练完成，MSE损失: 0.011794\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600023.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600025 (10/300)\n",
      "==================================================\n",
      "股票 600023 训练完成，MSE损失: 0.011794\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600023.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600025 (10/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1770, 230), 目标变量形状: (1770,)\n",
      "  特征矩阵形状: (1770, 230), 目标变量形状: (1770,)\n",
      "股票 600025 训练完成，MSE损失: 0.004380\n",
      "数据点数量: 1770, 模型保存至: ./../../model\\lightgbm_model_600025.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600026 (11/300)\n",
      "==================================================\n",
      "股票 600025 训练完成，MSE损失: 0.004380\n",
      "数据点数量: 1770, 模型保存至: ./../../model\\lightgbm_model_600025.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600026 (11/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2324, 230), 目标变量形状: (2324,)\n",
      "  特征矩阵形状: (2324, 230), 目标变量形状: (2324,)\n",
      "股票 600026 训练完成，MSE损失: 0.027754\n",
      "数据点数量: 2324, 模型保存至: ./../../model\\lightgbm_model_600026.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600027 (12/300)\n",
      "==================================================\n",
      "股票 600026 训练完成，MSE损失: 0.027754\n",
      "数据点数量: 2324, 模型保存至: ./../../model\\lightgbm_model_600026.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600027 (12/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "股票 600027 训练完成，MSE损失: 0.008089\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_600027.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600028 (13/300)\n",
      "==================================================\n",
      "股票 600027 训练完成，MSE损失: 0.008089\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_600027.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600028 (13/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600028 训练完成，MSE损失: 0.003065\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600028.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600029 (14/300)\n",
      "==================================================\n",
      "股票 600028 训练完成，MSE损失: 0.003065\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600028.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600029 (14/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "股票 600029 训练完成，MSE损失: 0.018717\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_600029.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600030 (15/300)\n",
      "==================================================\n",
      "股票 600029 训练完成，MSE损失: 0.018717\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_600029.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600030 (15/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "股票 600030 训练完成，MSE损失: 0.081292\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_600030.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600031 (16/300)\n",
      "==================================================\n",
      "股票 600030 训练完成，MSE损失: 0.081292\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_600030.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600031 (16/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "股票 600031 训练完成，MSE损失: 0.081204\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_600031.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600036 (17/300)\n",
      "==================================================\n",
      "股票 600031 训练完成，MSE损失: 0.081204\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_600031.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600036 (17/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600036 训练完成，MSE损失: 0.162701\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600036.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600039 (18/300)\n",
      "==================================================\n",
      "股票 600036 训练完成，MSE损失: 0.162701\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600036.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600039 (18/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2400, 230), 目标变量形状: (2400,)\n",
      "  特征矩阵形状: (2400, 230), 目标变量形状: (2400,)\n",
      "股票 600039 训练完成，MSE损失: 0.005500\n",
      "数据点数量: 2400, 模型保存至: ./../../model\\lightgbm_model_600039.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600048 (19/300)\n",
      "==================================================\n",
      "股票 600039 训练完成，MSE损失: 0.005500\n",
      "数据点数量: 2400, 模型保存至: ./../../model\\lightgbm_model_600039.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600048 (19/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "股票 600048 训练完成，MSE损失: 0.038128\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_600048.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600050 (20/300)\n",
      "==================================================\n",
      "股票 600048 训练完成，MSE损失: 0.038128\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_600048.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600050 (20/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2327, 230), 目标变量形状: (2327,)\n",
      "  特征矩阵形状: (2327, 230), 目标变量形状: (2327,)\n",
      "股票 600050 训练完成，MSE损失: 0.006917\n",
      "数据点数量: 2327, 模型保存至: ./../../model\\lightgbm_model_600050.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600061 (21/300)\n",
      "==================================================\n",
      "股票 600050 训练完成，MSE损失: 0.006917\n",
      "数据点数量: 2327, 模型保存至: ./../../model\\lightgbm_model_600050.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600061 (21/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2382, 230), 目标变量形状: (2382,)\n",
      "  特征矩阵形状: (2382, 230), 目标变量形状: (2382,)\n",
      "股票 600061 训练完成，MSE损失: 0.031776\n",
      "数据点数量: 2382, 模型保存至: ./../../model\\lightgbm_model_600061.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600066 (22/300)\n",
      "==================================================\n",
      "股票 600061 训练完成，MSE损失: 0.031776\n",
      "数据点数量: 2382, 模型保存至: ./../../model\\lightgbm_model_600061.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600066 (22/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "股票 600066 训练完成，MSE损失: 0.060437\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_600066.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600085 (23/300)\n",
      "==================================================\n",
      "股票 600066 训练完成，MSE损失: 0.060437\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_600066.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600085 (23/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600085 训练完成，MSE损失: 0.267648\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600085.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600089 (24/300)\n",
      "==================================================\n",
      "股票 600085 训练完成，MSE损失: 0.267648\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600085.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600089 (24/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2413, 230), 目标变量形状: (2413,)\n",
      "  特征矩阵形状: (2413, 230), 目标变量形状: (2413,)\n",
      "股票 600089 训练完成，MSE损失: 0.026397\n",
      "数据点数量: 2413, 模型保存至: ./../../model\\lightgbm_model_600089.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600104 (25/300)\n",
      "==================================================\n",
      "股票 600089 训练完成，MSE损失: 0.026397\n",
      "数据点数量: 2413, 模型保存至: ./../../model\\lightgbm_model_600089.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600104 (25/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2402, 230), 目标变量形状: (2402,)\n",
      "  特征矩阵形状: (2402, 230), 目标变量形状: (2402,)\n",
      "股票 600104 训练完成，MSE损失: 0.075193\n",
      "数据点数量: 2402, 模型保存至: ./../../model\\lightgbm_model_600104.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600111 (26/300)\n",
      "==================================================\n",
      "股票 600104 训练完成，MSE损失: 0.075193\n",
      "数据点数量: 2402, 模型保存至: ./../../model\\lightgbm_model_600104.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600111 (26/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600111 训练完成，MSE损失: 0.184263\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600111.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600115 (27/300)\n",
      "==================================================\n",
      "股票 600111 训练完成，MSE损失: 0.184263\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600111.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600115 (27/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2414, 230), 目标变量形状: (2414,)\n",
      "  特征矩阵形状: (2414, 230), 目标变量形状: (2414,)\n",
      "股票 600115 训练完成，MSE损失: 0.010707\n",
      "数据点数量: 2414, 模型保存至: ./../../model\\lightgbm_model_600115.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600150 (28/300)\n",
      "==================================================\n",
      "股票 600115 训练完成，MSE损失: 0.010707\n",
      "数据点数量: 2414, 模型保存至: ./../../model\\lightgbm_model_600115.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600150 (28/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2285, 230), 目标变量形状: (2285,)\n",
      "  特征矩阵形状: (2285, 230), 目标变量形状: (2285,)\n",
      "股票 600150 训练完成，MSE损失: 0.318117\n",
      "数据点数量: 2285, 模型保存至: ./../../model\\lightgbm_model_600150.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600160 (29/300)\n",
      "==================================================\n",
      "股票 600150 训练完成，MSE损失: 0.318117\n",
      "数据点数量: 2285, 模型保存至: ./../../model\\lightgbm_model_600150.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600160 (29/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2401, 230), 目标变量形状: (2401,)\n",
      "  特征矩阵形状: (2401, 230), 目标变量形状: (2401,)\n",
      "股票 600160 训练完成，MSE损失: 0.049856\n",
      "数据点数量: 2401, 模型保存至: ./../../model\\lightgbm_model_600160.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600161 (30/300)\n",
      "==================================================\n",
      "股票 600160 训练完成，MSE损失: 0.049856\n",
      "数据点数量: 2401, 模型保存至: ./../../model\\lightgbm_model_600160.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600161 (30/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2301, 230), 目标变量形状: (2301,)\n",
      "  特征矩阵形状: (2301, 230), 目标变量形状: (2301,)\n",
      "股票 600161 训练完成，MSE损失: 0.082178\n",
      "数据点数量: 2301, 模型保存至: ./../../model\\lightgbm_model_600161.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600176 (31/300)\n",
      "==================================================\n",
      "股票 600161 训练完成，MSE损失: 0.082178\n",
      "数据点数量: 2301, 模型保存至: ./../../model\\lightgbm_model_600161.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600176 (31/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2400, 230), 目标变量形状: (2400,)\n",
      "  特征矩阵形状: (2400, 230), 目标变量形状: (2400,)\n",
      "股票 600176 训练完成，MSE损失: 0.038855\n",
      "数据点数量: 2400, 模型保存至: ./../../model\\lightgbm_model_600176.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600183 (32/300)\n",
      "==================================================\n",
      "股票 600176 训练完成，MSE损失: 0.038855\n",
      "数据点数量: 2400, 模型保存至: ./../../model\\lightgbm_model_600176.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600183 (32/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600183 训练完成，MSE损失: 0.090875\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600183.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600188 (33/300)\n",
      "==================================================\n",
      "股票 600183 训练完成，MSE损失: 0.090875\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600183.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600188 (33/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "股票 600188 训练完成，MSE损失: 0.039848\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_600188.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600196 (34/300)\n",
      "==================================================\n",
      "股票 600188 训练完成，MSE损失: 0.039848\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_600188.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600196 (34/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2420, 230), 目标变量形状: (2420,)\n",
      "  特征矩阵形状: (2420, 230), 目标变量形状: (2420,)\n",
      "股票 600196 训练完成，MSE损失: 0.519550\n",
      "数据点数量: 2420, 模型保存至: ./../../model\\lightgbm_model_600196.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600219 (35/300)\n",
      "==================================================\n",
      "股票 600196 训练完成，MSE损失: 0.519550\n",
      "数据点数量: 2420, 模型保存至: ./../../model\\lightgbm_model_600196.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600219 (35/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2316, 230), 目标变量形状: (2316,)\n",
      "  特征矩阵形状: (2316, 230), 目标变量形状: (2316,)\n",
      "股票 600219 训练完成，MSE损失: 0.002143\n",
      "数据点数量: 2316, 模型保存至: ./../../model\\lightgbm_model_600219.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600233 (36/300)\n",
      "==================================================\n",
      "股票 600219 训练完成，MSE损失: 0.002143\n",
      "数据点数量: 2316, 模型保存至: ./../../model\\lightgbm_model_600219.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600233 (36/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2325, 230), 目标变量形状: (2325,)\n",
      "  特征矩阵形状: (2325, 230), 目标变量形状: (2325,)\n",
      "股票 600233 训练完成，MSE损失: 0.083285\n",
      "数据点数量: 2325, 模型保存至: ./../../model\\lightgbm_model_600233.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600276 (37/300)\n",
      "==================================================\n",
      "股票 600233 训练完成，MSE损失: 0.083285\n",
      "数据点数量: 2325, 模型保存至: ./../../model\\lightgbm_model_600233.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600276 (37/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "股票 600276 训练完成，MSE损失: 0.363773\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_600276.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600309 (38/300)\n",
      "==================================================\n",
      "股票 600276 训练完成，MSE损失: 0.363773\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_600276.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600309 (38/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2289, 230), 目标变量形状: (2289,)\n",
      "  特征矩阵形状: (2289, 230), 目标变量形状: (2289,)\n",
      "股票 600309 训练完成，MSE损失: 0.976952\n",
      "数据点数量: 2289, 模型保存至: ./../../model\\lightgbm_model_600309.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600332 (39/300)\n",
      "==================================================\n",
      "股票 600309 训练完成，MSE损失: 0.976952\n",
      "数据点数量: 2289, 模型保存至: ./../../model\\lightgbm_model_600309.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600332 (39/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2373, 230), 目标变量形状: (2373,)\n",
      "  特征矩阵形状: (2373, 230), 目标变量形状: (2373,)\n",
      "股票 600332 训练完成，MSE损失: 0.170464\n",
      "数据点数量: 2373, 模型保存至: ./../../model\\lightgbm_model_600332.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600346 (40/300)\n",
      "==================================================\n",
      "股票 600332 训练完成，MSE损失: 0.170464\n",
      "数据点数量: 2373, 模型保存至: ./../../model\\lightgbm_model_600332.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600346 (40/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2213, 230), 目标变量形状: (2213,)\n",
      "  特征矩阵形状: (2213, 230), 目标变量形状: (2213,)\n",
      "股票 600346 训练完成，MSE损失: 0.102151\n",
      "数据点数量: 2213, 模型保存至: ./../../model\\lightgbm_model_600346.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600362 (41/300)\n",
      "==================================================\n",
      "股票 600346 训练完成，MSE损失: 0.102151\n",
      "数据点数量: 2213, 模型保存至: ./../../model\\lightgbm_model_600346.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600362 (41/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2414, 230), 目标变量形状: (2414,)\n",
      "  特征矩阵形状: (2414, 230), 目标变量形状: (2414,)\n",
      "股票 600362 训练完成，MSE损失: 0.087264\n",
      "数据点数量: 2414, 模型保存至: ./../../model\\lightgbm_model_600362.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600372 (42/300)\n",
      "==================================================\n",
      "股票 600362 训练完成，MSE损失: 0.087264\n",
      "数据点数量: 2414, 模型保存至: ./../../model\\lightgbm_model_600362.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600372 (42/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2394, 230), 目标变量形状: (2394,)\n",
      "  特征矩阵形状: (2394, 230), 目标变量形状: (2394,)\n",
      "股票 600372 训练完成，MSE损失: 0.115277\n",
      "数据点数量: 2394, 模型保存至: ./../../model\\lightgbm_model_600372.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600377 (43/300)\n",
      "==================================================\n",
      "股票 600372 训练完成，MSE损失: 0.115277\n",
      "数据点数量: 2394, 模型保存至: ./../../model\\lightgbm_model_600372.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600377 (43/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600377 训练完成，MSE损失: 0.008536\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600377.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600406 (44/300)\n",
      "==================================================\n",
      "股票 600377 训练完成，MSE损失: 0.008536\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600377.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600406 (44/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2313, 230), 目标变量形状: (2313,)\n",
      "  特征矩阵形状: (2313, 230), 目标变量形状: (2313,)\n",
      "股票 600406 训练完成，MSE损失: 0.059051\n",
      "数据点数量: 2313, 模型保存至: ./../../model\\lightgbm_model_600406.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600415 (45/300)\n",
      "==================================================\n",
      "股票 600406 训练完成，MSE损失: 0.059051\n",
      "数据点数量: 2313, 模型保存至: ./../../model\\lightgbm_model_600406.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600415 (45/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "股票 600415 训练完成，MSE损失: 0.018553\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_600415.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600426 (46/300)\n",
      "==================================================\n",
      "股票 600415 训练完成，MSE损失: 0.018553\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_600415.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600426 (46/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "股票 600426 训练完成，MSE损失: 0.098903\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_600426.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600436 (47/300)\n",
      "==================================================\n",
      "股票 600426 训练完成，MSE损失: 0.098903\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_600426.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600436 (47/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2416, 230), 目标变量形状: (2416,)\n",
      "  特征矩阵形状: (2416, 230), 目标变量形状: (2416,)\n",
      "股票 600436 训练完成，MSE损失: 8.747002\n",
      "数据点数量: 2416, 模型保存至: ./../../model\\lightgbm_model_600436.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600438 (48/300)\n",
      "==================================================\n",
      "股票 600436 训练完成，MSE损失: 8.747002\n",
      "数据点数量: 2416, 模型保存至: ./../../model\\lightgbm_model_600436.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600438 (48/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2332, 230), 目标变量形状: (2332,)\n",
      "  特征矩阵形状: (2332, 230), 目标变量形状: (2332,)\n",
      "股票 600438 训练完成，MSE损失: 0.232931\n",
      "数据点数量: 2332, 模型保存至: ./../../model\\lightgbm_model_600438.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600460 (49/300)\n",
      "==================================================\n",
      "股票 600438 训练完成，MSE损失: 0.232931\n",
      "数据点数量: 2332, 模型保存至: ./../../model\\lightgbm_model_600438.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600460 (49/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2337, 230), 目标变量形状: (2337,)\n",
      "  特征矩阵形状: (2337, 230), 目标变量形状: (2337,)\n",
      "股票 600460 训练完成，MSE损失: 0.231372\n",
      "数据点数量: 2337, 模型保存至: ./../../model\\lightgbm_model_600460.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600482 (50/300)\n",
      "==================================================\n",
      "股票 600460 训练完成，MSE损失: 0.231372\n",
      "数据点数量: 2337, 模型保存至: ./../../model\\lightgbm_model_600460.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600482 (50/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2299, 230), 目标变量形状: (2299,)\n",
      "  特征矩阵形状: (2299, 230), 目标变量形状: (2299,)\n",
      "股票 600482 训练完成，MSE损失: 0.138072\n",
      "数据点数量: 2299, 模型保存至: ./../../model\\lightgbm_model_600482.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600489 (51/300)\n",
      "==================================================\n",
      "股票 600482 训练完成，MSE损失: 0.138072\n",
      "数据点数量: 2299, 模型保存至: ./../../model\\lightgbm_model_600482.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600489 (51/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2403, 230), 目标变量形状: (2403,)\n",
      "  特征矩阵形状: (2403, 230), 目标变量形状: (2403,)\n",
      "股票 600489 训练完成，MSE损失: 0.023155\n",
      "数据点数量: 2403, 模型保存至: ./../../model\\lightgbm_model_600489.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600515 (52/300)\n",
      "==================================================\n",
      "股票 600489 训练完成，MSE损失: 0.023155\n",
      "数据点数量: 2403, 模型保存至: ./../../model\\lightgbm_model_600489.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600515 (52/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2140, 230), 目标变量形状: (2140,)\n",
      "  特征矩阵形状: (2140, 230), 目标变量形状: (2140,)\n",
      "股票 600515 训练完成，MSE损失: 0.011848\n",
      "数据点数量: 2140, 模型保存至: ./../../model\\lightgbm_model_600515.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600519 (53/300)\n",
      "==================================================\n",
      "股票 600515 训练完成，MSE损失: 0.011848\n",
      "数据点数量: 2140, 模型保存至: ./../../model\\lightgbm_model_600515.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600519 (53/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600519 训练完成，MSE损失: 277.720616\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600519.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600547 (54/300)\n",
      "==================================================\n",
      "股票 600519 训练完成，MSE损失: 277.720616\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600519.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600547 (54/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2386, 230), 目标变量形状: (2386,)\n",
      "  特征矩阵形状: (2386, 230), 目标变量形状: (2386,)\n",
      "股票 600547 训练完成，MSE损失: 0.087837\n",
      "数据点数量: 2386, 模型保存至: ./../../model\\lightgbm_model_600547.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600570 (55/300)\n",
      "==================================================\n",
      "股票 600547 训练完成，MSE损失: 0.087837\n",
      "数据点数量: 2386, 模型保存至: ./../../model\\lightgbm_model_600547.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600570 (55/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "股票 600570 训练完成，MSE损失: 0.359148\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_600570.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600584 (56/300)\n",
      "==================================================\n",
      "股票 600570 训练完成，MSE损失: 0.359148\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_600570.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600584 (56/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2269, 230), 目标变量形状: (2269,)\n",
      "  特征矩阵形状: (2269, 230), 目标变量形状: (2269,)\n",
      "股票 600584 训练完成，MSE损失: 0.250258\n",
      "数据点数量: 2269, 模型保存至: ./../../model\\lightgbm_model_600584.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600585 (57/300)\n",
      "==================================================\n",
      "股票 600584 训练完成，MSE损失: 0.250258\n",
      "数据点数量: 2269, 模型保存至: ./../../model\\lightgbm_model_600584.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600585 (57/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600585 训练完成，MSE损失: 0.194501\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600585.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600588 (58/300)\n",
      "==================================================\n",
      "股票 600585 训练完成，MSE损失: 0.194501\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600585.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600588 (58/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2416, 230), 目标变量形状: (2416,)\n",
      "  特征矩阵形状: (2416, 230), 目标变量形状: (2416,)\n",
      "股票 600588 训练完成，MSE损失: 0.189636\n",
      "数据点数量: 2416, 模型保存至: ./../../model\\lightgbm_model_600588.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600600 (59/300)\n",
      "==================================================\n",
      "股票 600588 训练完成，MSE损失: 0.189636\n",
      "数据点数量: 2416, 模型保存至: ./../../model\\lightgbm_model_600588.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600600 (59/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600600 训练完成，MSE损失: 0.935637\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600600.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600660 (60/300)\n",
      "==================================================\n",
      "股票 600600 训练完成，MSE损失: 0.935637\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600600.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600660 (60/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600660 训练完成，MSE损失: 0.190358\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600660.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600674 (61/300)\n",
      "==================================================\n",
      "股票 600660 训练完成，MSE损失: 0.190358\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600660.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600674 (61/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 600674 训练完成，MSE损失: 0.015805\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600674.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600690 (62/300)\n",
      "==================================================\n",
      "股票 600674 训练完成，MSE损失: 0.015805\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_600674.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600690 (62/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2345, 230), 目标变量形状: (2345,)\n",
      "  特征矩阵形状: (2345, 230), 目标变量形状: (2345,)\n",
      "股票 600690 训练完成，MSE损失: 0.083558\n",
      "数据点数量: 2345, 模型保存至: ./../../model\\lightgbm_model_600690.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600741 (63/300)\n",
      "==================================================\n",
      "股票 600690 训练完成，MSE损失: 0.083558\n",
      "数据点数量: 2345, 模型保存至: ./../../model\\lightgbm_model_600690.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600741 (63/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "股票 600741 训练完成，MSE损失: 0.094949\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_600741.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600745 (64/300)\n",
      "==================================================\n",
      "股票 600741 训练完成，MSE损失: 0.094949\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_600741.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600745 (64/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2072, 230), 目标变量形状: (2072,)\n",
      "  特征矩阵形状: (2072, 230), 目标变量形状: (2072,)\n",
      "股票 600745 训练完成，MSE损失: 1.784232\n",
      "数据点数量: 2072, 模型保存至: ./../../model\\lightgbm_model_600745.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600760 (65/300)\n",
      "==================================================\n",
      "股票 600745 训练完成，MSE损失: 1.784232\n",
      "数据点数量: 2072, 模型保存至: ./../../model\\lightgbm_model_600745.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600760 (65/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2340, 230), 目标变量形状: (2340,)\n",
      "  特征矩阵形状: (2340, 230), 目标变量形状: (2340,)\n",
      "股票 600760 训练完成，MSE损失: 0.274404\n",
      "数据点数量: 2340, 模型保存至: ./../../model\\lightgbm_model_600760.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600795 (66/300)\n",
      "==================================================\n",
      "股票 600760 训练完成，MSE损失: 0.274404\n",
      "数据点数量: 2340, 模型保存至: ./../../model\\lightgbm_model_600760.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600795 (66/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2358, 230), 目标变量形状: (2358,)\n",
      "  特征矩阵形状: (2358, 230), 目标变量形状: (2358,)\n",
      "股票 600795 训练完成，MSE损失: 0.002189\n",
      "数据点数量: 2358, 模型保存至: ./../../model\\lightgbm_model_600795.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600803 (67/300)\n",
      "==================================================\n",
      "股票 600795 训练完成，MSE损失: 0.002189\n",
      "数据点数量: 2358, 模型保存至: ./../../model\\lightgbm_model_600795.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600803 (67/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2359, 230), 目标变量形状: (2359,)\n",
      "  特征矩阵形状: (2359, 230), 目标变量形状: (2359,)\n",
      "股票 600803 训练完成，MSE损失: 0.051589\n",
      "数据点数量: 2359, 模型保存至: ./../../model\\lightgbm_model_600803.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600809 (68/300)\n",
      "==================================================\n",
      "股票 600803 训练完成，MSE损失: 0.051589\n",
      "数据点数量: 2359, 模型保存至: ./../../model\\lightgbm_model_600803.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600809 (68/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "股票 600809 训练完成，MSE损失: 6.994415\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_600809.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600845 (69/300)\n",
      "==================================================\n",
      "股票 600809 训练完成，MSE损失: 6.994415\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_600809.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600845 (69/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2417, 230), 目标变量形状: (2417,)\n",
      "  特征矩阵形状: (2417, 230), 目标变量形状: (2417,)\n",
      "股票 600845 训练完成，MSE损失: 0.118822\n",
      "数据点数量: 2417, 模型保存至: ./../../model\\lightgbm_model_600845.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600875 (70/300)\n",
      "==================================================\n",
      "股票 600845 训练完成，MSE损失: 0.118822\n",
      "数据点数量: 2417, 模型保存至: ./../../model\\lightgbm_model_600845.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600875 (70/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2346, 230), 目标变量形状: (2346,)\n",
      "  特征矩阵形状: (2346, 230), 目标变量形状: (2346,)\n",
      "股票 600875 训练完成，MSE损失: 0.062994\n",
      "数据点数量: 2346, 模型保存至: ./../../model\\lightgbm_model_600875.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600886 (71/300)\n",
      "==================================================\n",
      "股票 600875 训练完成，MSE损失: 0.062994\n",
      "数据点数量: 2346, 模型保存至: ./../../model\\lightgbm_model_600875.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600886 (71/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2362, 230), 目标变量形状: (2362,)\n",
      "  特征矩阵形状: (2362, 230), 目标变量形状: (2362,)\n",
      "股票 600886 训练完成，MSE损失: 0.012748\n",
      "数据点数量: 2362, 模型保存至: ./../../model\\lightgbm_model_600886.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600887 (72/300)\n",
      "==================================================\n",
      "股票 600886 训练完成，MSE损失: 0.012748\n",
      "数据点数量: 2362, 模型保存至: ./../../model\\lightgbm_model_600886.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600887 (72/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2398, 230), 目标变量形状: (2398,)\n",
      "  特征矩阵形状: (2398, 230), 目标变量形状: (2398,)\n",
      "股票 600887 训练完成，MSE损失: 0.151002\n",
      "数据点数量: 2398, 模型保存至: ./../../model\\lightgbm_model_600887.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600893 (73/300)\n",
      "==================================================\n",
      "股票 600887 训练完成，MSE损失: 0.151002\n",
      "数据点数量: 2398, 模型保存至: ./../../model\\lightgbm_model_600887.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600893 (73/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2387, 230), 目标变量形状: (2387,)\n",
      "  特征矩阵形状: (2387, 230), 目标变量形状: (2387,)\n",
      "股票 600893 训练完成，MSE损失: 0.481077\n",
      "数据点数量: 2387, 模型保存至: ./../../model\\lightgbm_model_600893.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600900 (74/300)\n",
      "==================================================\n",
      "股票 600893 训练完成，MSE损失: 0.481077\n",
      "数据点数量: 2387, 模型保存至: ./../../model\\lightgbm_model_600893.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600900 (74/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2303, 230), 目标变量形状: (2303,)\n",
      "  特征矩阵形状: (2303, 230), 目标变量形状: (2303,)\n",
      "股票 600900 训练完成，MSE损失: 0.022863\n",
      "数据点数量: 2303, 模型保存至: ./../../model\\lightgbm_model_600900.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600905 (75/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (925, 230), 目标变量形状: (925,)\n",
      "股票 600900 训练完成，MSE损失: 0.022863\n",
      "数据点数量: 2303, 模型保存至: ./../../model\\lightgbm_model_600900.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600905 (75/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (925, 230), 目标变量形状: (925,)\n",
      "股票 600905 训练完成，MSE损失: 0.002697\n",
      "数据点数量: 925, 模型保存至: ./../../model\\lightgbm_model_600905.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600918 (76/300)\n",
      "==================================================\n",
      "股票 600905 训练完成，MSE损失: 0.002697\n",
      "数据点数量: 925, 模型保存至: ./../../model\\lightgbm_model_600905.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600918 (76/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1173, 230), 目标变量形状: (1173,)\n",
      "  特征矩阵形状: (1173, 230), 目标变量形状: (1173,)\n",
      "股票 600918 训练完成，MSE损失: 0.024995\n",
      "数据点数量: 1173, 模型保存至: ./../../model\\lightgbm_model_600918.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600919 (77/300)\n",
      "==================================================\n",
      "股票 600918 训练完成，MSE损失: 0.024995\n",
      "数据点数量: 1173, 模型保存至: ./../../model\\lightgbm_model_600918.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600919 (77/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2099, 230), 目标变量形状: (2099,)\n",
      "  特征矩阵形状: (2099, 230), 目标变量形状: (2099,)\n",
      "股票 600919 训练完成，MSE损失: 0.003250\n",
      "数据点数量: 2099, 模型保存至: ./../../model\\lightgbm_model_600919.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600926 (78/300)\n",
      "==================================================\n",
      "股票 600919 训练完成，MSE损失: 0.003250\n",
      "数据点数量: 2099, 模型保存至: ./../../model\\lightgbm_model_600919.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600926 (78/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2050, 230), 目标变量形状: (2050,)\n",
      "  特征矩阵形状: (2050, 230), 目标变量形状: (2050,)\n",
      "股票 600926 训练完成，MSE损失: 0.015283\n",
      "数据点数量: 2050, 模型保存至: ./../../model\\lightgbm_model_600926.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600938 (79/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (716, 230), 目标变量形状: (716,)\n",
      "股票 600926 训练完成，MSE损失: 0.015283\n",
      "数据点数量: 2050, 模型保存至: ./../../model\\lightgbm_model_600926.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600938 (79/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (716, 230), 目标变量形状: (716,)\n",
      "股票 600938 训练完成，MSE损失: 0.053755\n",
      "数据点数量: 716, 模型保存至: ./../../model\\lightgbm_model_600938.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600941 (80/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (785, 230), 目标变量形状: (785,)\n",
      "股票 600938 训练完成，MSE损失: 0.053755\n",
      "数据点数量: 716, 模型保存至: ./../../model\\lightgbm_model_600938.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600941 (80/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (785, 230), 目标变量形状: (785,)\n",
      "股票 600941 训练完成，MSE损失: 0.494138\n",
      "数据点数量: 785, 模型保存至: ./../../model\\lightgbm_model_600941.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600958 (81/300)\n",
      "==================================================\n",
      "股票 600941 训练完成，MSE损失: 0.494138\n",
      "数据点数量: 785, 模型保存至: ./../../model\\lightgbm_model_600941.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600958 (81/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "股票 600958 训练完成，MSE损失: 0.047730\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_600958.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600989 (82/300)\n",
      "==================================================\n",
      "股票 600958 训练完成，MSE损失: 0.047730\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_600958.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600989 (82/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1429, 230), 目标变量形状: (1429,)\n",
      "  特征矩阵形状: (1429, 230), 目标变量形状: (1429,)\n",
      "股票 600989 训练完成，MSE损失: 0.030466\n",
      "数据点数量: 1429, 模型保存至: ./../../model\\lightgbm_model_600989.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600999 (83/300)\n",
      "==================================================\n",
      "股票 600989 训练完成，MSE损失: 0.030466\n",
      "数据点数量: 1429, 模型保存至: ./../../model\\lightgbm_model_600989.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 600999 (83/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "股票 600999 训练完成，MSE损失: 0.044763\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_600999.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601006 (84/300)\n",
      "==================================================\n",
      "股票 600999 训练完成，MSE损失: 0.044763\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_600999.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601006 (84/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601006 训练完成，MSE损失: 0.006519\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601006.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601009 (85/300)\n",
      "==================================================\n",
      "股票 601006 训练完成，MSE损失: 0.006519\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601006.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601009 (85/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "股票 601009 训练完成，MSE损失: 0.009052\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_601009.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601012 (86/300)\n",
      "==================================================\n",
      "股票 601009 训练完成，MSE损失: 0.009052\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_601009.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601012 (86/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "股票 601012 训练完成，MSE损失: 0.213531\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_601012.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601021 (87/300)\n",
      "==================================================\n",
      "股票 601012 训练完成，MSE损失: 0.213531\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_601012.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601021 (87/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2398, 230), 目标变量形状: (2398,)\n",
      "  特征矩阵形状: (2398, 230), 目标变量形状: (2398,)\n",
      "股票 601021 训练完成，MSE损失: 0.477780\n",
      "数据点数量: 2398, 模型保存至: ./../../model\\lightgbm_model_601021.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601058 (88/300)\n",
      "==================================================\n",
      "股票 601021 训练完成，MSE损失: 0.477780\n",
      "数据点数量: 2398, 模型保存至: ./../../model\\lightgbm_model_601021.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601058 (88/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "股票 601058 训练完成，MSE损失: 0.016650\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_601058.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601059 (89/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (528, 230), 目标变量形状: (528,)\n",
      "股票 601058 训练完成，MSE损失: 0.016650\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_601058.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601059 (89/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (528, 230), 目标变量形状: (528,)\n",
      "股票 601059 训练完成，MSE损失: 0.062341\n",
      "数据点数量: 528, 模型保存至: ./../../model\\lightgbm_model_601059.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601066 (90/300)\n",
      "==================================================\n",
      "股票 601059 训练完成，MSE损失: 0.062341\n",
      "数据点数量: 528, 模型保存至: ./../../model\\lightgbm_model_601059.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601066 (90/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1648, 230), 目标变量形状: (1648,)\n",
      "  特征矩阵形状: (1648, 230), 目标变量形状: (1648,)\n",
      "股票 601066 训练完成，MSE损失: 0.183885\n",
      "数据点数量: 1648, 模型保存至: ./../../model\\lightgbm_model_601066.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601088 (91/300)\n",
      "==================================================\n",
      "股票 601066 训练完成，MSE损失: 0.183885\n",
      "数据点数量: 1648, 模型保存至: ./../../model\\lightgbm_model_601066.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601088 (91/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2358, 230), 目标变量形状: (2358,)\n",
      "  特征矩阵形状: (2358, 230), 目标变量形状: (2358,)\n",
      "股票 601088 训练完成，MSE损失: 0.100255\n",
      "数据点数量: 2358, 模型保存至: ./../../model\\lightgbm_model_601088.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601100 (92/300)\n",
      "==================================================\n",
      "股票 601088 训练完成，MSE损失: 0.100255\n",
      "数据点数量: 2358, 模型保存至: ./../../model\\lightgbm_model_601088.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601100 (92/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2383, 230), 目标变量形状: (2383,)\n",
      "  特征矩阵形状: (2383, 230), 目标变量形状: (2383,)\n",
      "股票 601100 训练完成，MSE损失: 0.731061\n",
      "数据点数量: 2383, 模型保存至: ./../../model\\lightgbm_model_601100.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601111 (93/300)\n",
      "==================================================\n",
      "股票 601100 训练完成，MSE损失: 0.731061\n",
      "数据点数量: 2383, 模型保存至: ./../../model\\lightgbm_model_601100.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601111 (93/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2400, 230), 目标变量形状: (2400,)\n",
      "  特征矩阵形状: (2400, 230), 目标变量形状: (2400,)\n",
      "股票 601111 训练完成，MSE损失: 0.018589\n",
      "数据点数量: 2400, 模型保存至: ./../../model\\lightgbm_model_601111.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601117 (94/300)\n",
      "==================================================\n",
      "股票 601111 训练完成，MSE损失: 0.018589\n",
      "数据点数量: 2400, 模型保存至: ./../../model\\lightgbm_model_601111.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601117 (94/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "股票 601117 训练完成，MSE损失: 0.014782\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_601117.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601127 (95/300)\n",
      "==================================================\n",
      "股票 601117 训练完成，MSE损失: 0.014782\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_601117.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601127 (95/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2114, 230), 目标变量形状: (2114,)\n",
      "  特征矩阵形状: (2114, 230), 目标变量形状: (2114,)\n",
      "股票 601127 训练完成，MSE损失: 0.969744\n",
      "数据点数量: 2114, 模型保存至: ./../../model\\lightgbm_model_601127.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601136 (96/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (551, 230), 目标变量形状: (551,)\n",
      "股票 601127 训练完成，MSE损失: 0.969744\n",
      "数据点数量: 2114, 模型保存至: ./../../model\\lightgbm_model_601127.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601136 (96/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (551, 230), 目标变量形状: (551,)\n",
      "股票 601136 训练完成，MSE损失: 0.118039\n",
      "数据点数量: 551, 模型保存至: ./../../model\\lightgbm_model_601136.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601138 (97/300)\n",
      "==================================================\n",
      "股票 601136 训练完成，MSE损失: 0.118039\n",
      "数据点数量: 551, 模型保存至: ./../../model\\lightgbm_model_601136.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601138 (97/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1655, 230), 目标变量形状: (1655,)\n",
      "  特征矩阵形状: (1655, 230), 目标变量形状: (1655,)\n",
      "股票 601138 训练完成，MSE损失: 0.064155\n",
      "数据点数量: 1655, 模型保存至: ./../../model\\lightgbm_model_601138.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601166 (98/300)\n",
      "==================================================\n",
      "股票 601138 训练完成，MSE损失: 0.064155\n",
      "数据点数量: 1655, 模型保存至: ./../../model\\lightgbm_model_601138.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601166 (98/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2417, 230), 目标变量形状: (2417,)\n",
      "  特征矩阵形状: (2417, 230), 目标变量形状: (2417,)\n",
      "股票 601166 训练完成，MSE损失: 0.034357\n",
      "数据点数量: 2417, 模型保存至: ./../../model\\lightgbm_model_601166.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601169 (99/300)\n",
      "==================================================\n",
      "股票 601166 训练完成，MSE损失: 0.034357\n",
      "数据点数量: 2417, 模型保存至: ./../../model\\lightgbm_model_601166.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601169 (99/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2383, 230), 目标变量形状: (2383,)\n",
      "  特征矩阵形状: (2383, 230), 目标变量形状: (2383,)\n",
      "股票 601169 训练完成，MSE损失: 0.002458\n",
      "数据点数量: 2383, 模型保存至: ./../../model\\lightgbm_model_601169.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601186 (100/300)\n",
      "==================================================\n",
      "股票 601169 训练完成，MSE损失: 0.002458\n",
      "数据点数量: 2383, 模型保存至: ./../../model\\lightgbm_model_601169.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601186 (100/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601186 训练完成，MSE损失: 0.028396\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601186.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601211 (101/300)\n",
      "==================================================\n",
      "股票 601186 训练完成，MSE损失: 0.028396\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601186.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601211 (101/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2356, 230), 目标变量形状: (2356,)\n",
      "  特征矩阵形状: (2356, 230), 目标变量形状: (2356,)\n",
      "股票 601211 训练完成，MSE损失: 0.054021\n",
      "数据点数量: 2356, 模型保存至: ./../../model\\lightgbm_model_601211.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601225 (102/300)\n",
      "==================================================\n",
      "股票 601211 训练完成，MSE损失: 0.054021\n",
      "数据点数量: 2356, 模型保存至: ./../../model\\lightgbm_model_601211.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601225 (102/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601225 训练完成，MSE损失: 0.036994\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601225.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601229 (103/300)\n",
      "==================================================\n",
      "股票 601225 训练完成，MSE损失: 0.036994\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601225.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601229 (103/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2036, 230), 目标变量形状: (2036,)\n",
      "  特征矩阵形状: (2036, 230), 目标变量形状: (2036,)\n",
      "股票 601229 训练完成，MSE损失: 0.003785\n",
      "数据点数量: 2036, 模型保存至: ./../../model\\lightgbm_model_601229.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601236 (104/300)\n",
      "==================================================\n",
      "股票 601229 训练完成，MSE损失: 0.003785\n",
      "数据点数量: 2036, 模型保存至: ./../../model\\lightgbm_model_601229.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601236 (104/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1388, 230), 目标变量形状: (1388,)\n",
      "  特征矩阵形状: (1388, 230), 目标变量形状: (1388,)\n",
      "股票 601236 训练完成，MSE损失: 0.023975\n",
      "数据点数量: 1388, 模型保存至: ./../../model\\lightgbm_model_601236.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601238 (105/300)\n",
      "==================================================\n",
      "股票 601236 训练完成，MSE损失: 0.023975\n",
      "数据点数量: 1388, 模型保存至: ./../../model\\lightgbm_model_601236.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601238 (105/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "股票 601238 训练完成，MSE损失: 0.038350\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_601238.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601288 (106/300)\n",
      "==================================================\n",
      "股票 601238 训练完成，MSE损失: 0.038350\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_601238.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601288 (106/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601288 训练完成，MSE损失: 0.000754\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601288.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601318 (107/300)\n",
      "==================================================\n",
      "股票 601288 训练完成，MSE损失: 0.000754\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601288.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601318 (107/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601318 训练完成，MSE损失: 0.427622\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601318.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601319 (108/300)\n",
      "==================================================\n",
      "股票 601318 训练完成，MSE损失: 0.427622\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601318.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601319 (108/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1547, 230), 目标变量形状: (1547,)\n",
      "  特征矩阵形状: (1547, 230), 目标变量形状: (1547,)\n",
      "股票 601319 训练完成，MSE损失: 0.008896\n",
      "数据点数量: 1547, 模型保存至: ./../../model\\lightgbm_model_601319.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601328 (109/300)\n",
      "==================================================\n",
      "股票 601319 训练完成，MSE损失: 0.008896\n",
      "数据点数量: 1547, 模型保存至: ./../../model\\lightgbm_model_601319.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601328 (109/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601328 训练完成，MSE损失: 0.002967\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601328.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601336 (110/300)\n",
      "==================================================\n",
      "股票 601328 训练完成，MSE损失: 0.002967\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601328.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601336 (110/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601336 训练完成，MSE损失: 0.472129\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601336.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601360 (111/300)\n",
      "==================================================\n",
      "股票 601336 训练完成，MSE损失: 0.472129\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601336.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601360 (111/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2298, 230), 目标变量形状: (2298,)\n",
      "  特征矩阵形状: (2298, 230), 目标变量形状: (2298,)\n",
      "股票 601360 训练完成，MSE损失: 0.198567\n",
      "数据点数量: 2298, 模型保存至: ./../../model\\lightgbm_model_601360.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601377 (112/300)\n",
      "==================================================\n",
      "股票 601360 训练完成，MSE损失: 0.198567\n",
      "数据点数量: 2298, 模型保存至: ./../../model\\lightgbm_model_601360.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601377 (112/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2404, 230), 目标变量形状: (2404,)\n",
      "  特征矩阵形状: (2404, 230), 目标变量形状: (2404,)\n",
      "股票 601377 训练完成，MSE损失: 0.007789\n",
      "数据点数量: 2404, 模型保存至: ./../../model\\lightgbm_model_601377.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601390 (113/300)\n",
      "==================================================\n",
      "股票 601377 训练完成，MSE损失: 0.007789\n",
      "数据点数量: 2404, 模型保存至: ./../../model\\lightgbm_model_601377.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601390 (113/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2343, 230), 目标变量形状: (2343,)\n",
      "  特征矩阵形状: (2343, 230), 目标变量形状: (2343,)\n",
      "股票 601390 训练完成，MSE损失: 0.021628\n",
      "数据点数量: 2343, 模型保存至: ./../../model\\lightgbm_model_601390.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601398 (114/300)\n",
      "==================================================\n",
      "股票 601390 训练完成，MSE损失: 0.021628\n",
      "数据点数量: 2343, 模型保存至: ./../../model\\lightgbm_model_601390.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601398 (114/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601398 训练完成，MSE损失: 0.001721\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601398.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601600 (115/300)\n",
      "==================================================\n",
      "股票 601398 训练完成，MSE损失: 0.001721\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601398.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601600 (115/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2313, 230), 目标变量形状: (2313,)\n",
      "  特征矩阵形状: (2313, 230), 目标变量形状: (2313,)\n",
      "股票 601600 训练完成，MSE损失: 0.009821\n",
      "数据点数量: 2313, 模型保存至: ./../../model\\lightgbm_model_601600.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601601 (116/300)\n",
      "==================================================\n",
      "股票 601600 训练完成，MSE损失: 0.009821\n",
      "数据点数量: 2313, 模型保存至: ./../../model\\lightgbm_model_601600.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601601 (116/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601601 训练完成，MSE损失: 0.183519\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601601.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601607 (117/300)\n",
      "==================================================\n",
      "股票 601601 训练完成，MSE损失: 0.183519\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601601.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601607 (117/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601607 训练完成，MSE损失: 0.064197\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601607.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601618 (118/300)\n",
      "==================================================\n",
      "股票 601607 训练完成，MSE损失: 0.064197\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601607.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601618 (118/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2350, 230), 目标变量形状: (2350,)\n",
      "  特征矩阵形状: (2350, 230), 目标变量形状: (2350,)\n",
      "股票 601618 训练完成，MSE损失: 0.004871\n",
      "数据点数量: 2350, 模型保存至: ./../../model\\lightgbm_model_601618.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601628 (119/300)\n",
      "==================================================\n",
      "股票 601618 训练完成，MSE损失: 0.004871\n",
      "数据点数量: 2350, 模型保存至: ./../../model\\lightgbm_model_601618.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601628 (119/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601628 训练完成，MSE损失: 0.204847\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601628.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601633 (120/300)\n",
      "==================================================\n",
      "股票 601628 训练完成，MSE损失: 0.204847\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601628.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601633 (120/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2400, 230), 目标变量形状: (2400,)\n",
      "  特征矩阵形状: (2400, 230), 目标变量形状: (2400,)\n",
      "股票 601633 训练完成，MSE损失: 0.188170\n",
      "数据点数量: 2400, 模型保存至: ./../../model\\lightgbm_model_601633.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601658 (121/300)\n",
      "==================================================\n",
      "股票 601633 训练完成，MSE损失: 0.188170\n",
      "数据点数量: 2400, 模型保存至: ./../../model\\lightgbm_model_601633.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601658 (121/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1288, 230), 目标变量形状: (1288,)\n",
      "  特征矩阵形状: (1288, 230), 目标变量形状: (1288,)\n",
      "股票 601658 训练完成，MSE损失: 0.001421\n",
      "数据点数量: 1288, 模型保存至: ./../../model\\lightgbm_model_601658.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601668 (122/300)\n",
      "==================================================\n",
      "股票 601658 训练完成，MSE损失: 0.001421\n",
      "数据点数量: 1288, 模型保存至: ./../../model\\lightgbm_model_601658.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601668 (122/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601668 训练完成，MSE损失: 0.004559\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601668.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601669 (123/300)\n",
      "==================================================\n",
      "股票 601668 训练完成，MSE损失: 0.004559\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601668.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601669 (123/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2409, 230), 目标变量形状: (2409,)\n",
      "  特征矩阵形状: (2409, 230), 目标变量形状: (2409,)\n",
      "股票 601669 训练完成，MSE损失: 0.014282\n",
      "数据点数量: 2409, 模型保存至: ./../../model\\lightgbm_model_601669.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601688 (124/300)\n",
      "==================================================\n",
      "股票 601669 训练完成，MSE损失: 0.014282\n",
      "数据点数量: 2409, 模型保存至: ./../../model\\lightgbm_model_601669.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601688 (124/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601688 训练完成，MSE损失: 0.073952\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601688.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601689 (125/300)\n",
      "==================================================\n",
      "股票 601688 训练完成，MSE损失: 0.073952\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601688.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601689 (125/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "股票 601689 训练完成，MSE损失: 0.324118\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_601689.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601698 (126/300)\n",
      "==================================================\n",
      "股票 601689 训练完成，MSE损失: 0.324118\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_601689.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601698 (126/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1399, 230), 目标变量形状: (1399,)\n",
      "  特征矩阵形状: (1399, 230), 目标变量形状: (1399,)\n",
      "股票 601698 训练完成，MSE损失: 0.076068\n",
      "数据点数量: 1399, 模型保存至: ./../../model\\lightgbm_model_601698.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601699 (127/300)\n",
      "==================================================\n",
      "股票 601698 训练完成，MSE损失: 0.076068\n",
      "数据点数量: 1399, 模型保存至: ./../../model\\lightgbm_model_601698.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601699 (127/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2403, 230), 目标变量形状: (2403,)\n",
      "  特征矩阵形状: (2403, 230), 目标变量形状: (2403,)\n",
      "股票 601699 训练完成，MSE损失: 0.051494\n",
      "数据点数量: 2403, 模型保存至: ./../../model\\lightgbm_model_601699.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601728 (128/300)\n",
      "==================================================\n",
      "股票 601699 训练完成，MSE损失: 0.051494\n",
      "数据点数量: 2403, 模型保存至: ./../../model\\lightgbm_model_601699.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601728 (128/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (875, 230), 目标变量形状: (875,)\n",
      "  特征矩阵形状: (875, 230), 目标变量形状: (875,)\n",
      "股票 601728 训练完成，MSE损失: 0.002916\n",
      "数据点数量: 875, 模型保存至: ./../../model\\lightgbm_model_601728.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601766 (129/300)\n",
      "==================================================\n",
      "股票 601728 训练完成，MSE损失: 0.002916\n",
      "数据点数量: 875, 模型保存至: ./../../model\\lightgbm_model_601728.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601766 (129/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2390, 230), 目标变量形状: (2390,)\n",
      "  特征矩阵形状: (2390, 230), 目标变量形状: (2390,)\n",
      "股票 601766 训练完成，MSE损失: 0.116035\n",
      "数据点数量: 2390, 模型保存至: ./../../model\\lightgbm_model_601766.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601788 (130/300)\n",
      "==================================================\n",
      "股票 601766 训练完成，MSE损失: 0.116035\n",
      "数据点数量: 2390, 模型保存至: ./../../model\\lightgbm_model_601766.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601788 (130/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601788 训练完成，MSE损失: 0.084790\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601788.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601799 (131/300)\n",
      "==================================================\n",
      "股票 601788 训练完成，MSE损失: 0.084790\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601788.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601799 (131/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2409, 230), 目标变量形状: (2409,)\n",
      "  特征矩阵形状: (2409, 230), 目标变量形状: (2409,)\n",
      "股票 601799 训练完成，MSE损失: 3.128978\n",
      "数据点数量: 2409, 模型保存至: ./../../model\\lightgbm_model_601799.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601800 (132/300)\n",
      "==================================================\n",
      "股票 601799 训练完成，MSE损失: 3.128978\n",
      "数据点数量: 2409, 模型保存至: ./../../model\\lightgbm_model_601799.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601800 (132/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601800 训练完成，MSE损失: 0.034896\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601800.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601808 (133/300)\n",
      "==================================================\n",
      "股票 601800 训练完成，MSE损失: 0.034896\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601800.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601808 (133/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601808 训练完成，MSE损失: 0.068838\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601808.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601816 (134/300)\n",
      "==================================================\n",
      "股票 601808 训练完成，MSE损失: 0.068838\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601808.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601816 (134/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1262, 230), 目标变量形状: (1262,)\n",
      "  特征矩阵形状: (1262, 230), 目标变量形状: (1262,)\n",
      "股票 601816 训练完成，MSE损失: 0.001889\n",
      "数据点数量: 1262, 模型保存至: ./../../model\\lightgbm_model_601816.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601818 (135/300)\n",
      "==================================================\n",
      "股票 601816 训练完成，MSE损失: 0.001889\n",
      "数据点数量: 1262, 模型保存至: ./../../model\\lightgbm_model_601816.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601818 (135/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "股票 601818 训练完成，MSE损失: 0.001572\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_601818.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601838 (136/300)\n",
      "==================================================\n",
      "股票 601818 训练完成，MSE损失: 0.001572\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_601818.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601838 (136/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1738, 230), 目标变量形状: (1738,)\n",
      "  特征矩阵形状: (1738, 230), 目标变量形状: (1738,)\n",
      "股票 601838 训练完成，MSE损失: 0.017243\n",
      "数据点数量: 1738, 模型保存至: ./../../model\\lightgbm_model_601838.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601857 (137/300)\n",
      "==================================================\n",
      "股票 601838 训练完成，MSE损失: 0.017243\n",
      "数据点数量: 1738, 模型保存至: ./../../model\\lightgbm_model_601838.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601857 (137/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601857 训练完成，MSE损失: 0.006740\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601857.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601865 (138/300)\n",
      "==================================================\n",
      "股票 601857 训练完成，MSE损失: 0.006740\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601857.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601865 (138/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1489, 230), 目标变量形状: (1489,)\n",
      "  特征矩阵形状: (1489, 230), 目标变量形状: (1489,)\n",
      "股票 601865 训练完成，MSE损失: 0.306704\n",
      "数据点数量: 1489, 模型保存至: ./../../model\\lightgbm_model_601865.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601868 (139/300)\n",
      "==================================================\n",
      "股票 601865 训练完成，MSE损失: 0.306704\n",
      "数据点数量: 1489, 模型保存至: ./../../model\\lightgbm_model_601865.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601868 (139/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (850, 230), 目标变量形状: (850,)\n",
      "  特征矩阵形状: (850, 230), 目标变量形状: (850,)\n",
      "股票 601868 训练完成，MSE损失: 0.000416\n",
      "数据点数量: 850, 模型保存至: ./../../model\\lightgbm_model_601868.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601872 (140/300)\n",
      "==================================================\n",
      "股票 601868 训练完成，MSE损失: 0.000416\n",
      "数据点数量: 850, 模型保存至: ./../../model\\lightgbm_model_601868.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601872 (140/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2322, 230), 目标变量形状: (2322,)\n",
      "  特征矩阵形状: (2322, 230), 目标变量形状: (2322,)\n",
      "股票 601872 训练完成，MSE损失: 0.008993\n",
      "数据点数量: 2322, 模型保存至: ./../../model\\lightgbm_model_601872.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601877 (141/300)\n",
      "==================================================\n",
      "股票 601872 训练完成，MSE损失: 0.008993\n",
      "数据点数量: 2322, 模型保存至: ./../../model\\lightgbm_model_601872.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601877 (141/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2285, 230), 目标变量形状: (2285,)\n",
      "  特征矩阵形状: (2285, 230), 目标变量形状: (2285,)\n",
      "股票 601877 训练完成，MSE损失: 0.209945\n",
      "数据点数量: 2285, 模型保存至: ./../../model\\lightgbm_model_601877.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601878 (142/300)\n",
      "==================================================\n",
      "股票 601877 训练完成，MSE损失: 0.209945\n",
      "数据点数量: 2285, 模型保存至: ./../../model\\lightgbm_model_601877.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601878 (142/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1889, 230), 目标变量形状: (1889,)\n",
      "  特征矩阵形状: (1889, 230), 目标变量形状: (1889,)\n",
      "股票 601878 训练完成，MSE损失: 0.034768\n",
      "数据点数量: 1889, 模型保存至: ./../../model\\lightgbm_model_601878.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601881 (143/300)\n",
      "==================================================\n",
      "股票 601878 训练完成，MSE损失: 0.034768\n",
      "数据点数量: 1889, 模型保存至: ./../../model\\lightgbm_model_601878.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601881 (143/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1989, 230), 目标变量形状: (1989,)\n",
      "  特征矩阵形状: (1989, 230), 目标变量形状: (1989,)\n",
      "股票 601881 训练完成，MSE损失: 0.029906\n",
      "数据点数量: 1989, 模型保存至: ./../../model\\lightgbm_model_601881.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601888 (144/300)\n",
      "==================================================\n",
      "股票 601881 训练完成，MSE损失: 0.029906\n",
      "数据点数量: 1989, 模型保存至: ./../../model\\lightgbm_model_601881.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601888 (144/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2390, 230), 目标变量形状: (2390,)\n",
      "  特征矩阵形状: (2390, 230), 目标变量形状: (2390,)\n",
      "股票 601888 训练完成，MSE损失: 5.800229\n",
      "数据点数量: 2390, 模型保存至: ./../../model\\lightgbm_model_601888.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601898 (145/300)\n",
      "==================================================\n",
      "股票 601888 训练完成，MSE损失: 5.800229\n",
      "数据点数量: 2390, 模型保存至: ./../../model\\lightgbm_model_601888.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601898 (145/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601898 训练完成，MSE损失: 0.013355\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601898.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601899 (146/300)\n",
      "==================================================\n",
      "股票 601898 训练完成，MSE损失: 0.013355\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601898.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601899 (146/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2392, 230), 目标变量形状: (2392,)\n",
      "  特征矩阵形状: (2392, 230), 目标变量形状: (2392,)\n",
      "股票 601899 训练完成，MSE损失: 0.015153\n",
      "数据点数量: 2392, 模型保存至: ./../../model\\lightgbm_model_601899.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601901 (147/300)\n",
      "==================================================\n",
      "股票 601899 训练完成，MSE损失: 0.015153\n",
      "数据点数量: 2392, 模型保存至: ./../../model\\lightgbm_model_601899.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601901 (147/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2409, 230), 目标变量形状: (2409,)\n",
      "  特征矩阵形状: (2409, 230), 目标变量形状: (2409,)\n",
      "股票 601901 训练完成，MSE损失: 0.015802\n",
      "数据点数量: 2409, 模型保存至: ./../../model\\lightgbm_model_601901.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601916 (148/300)\n",
      "==================================================\n",
      "股票 601901 训练完成，MSE损失: 0.015802\n",
      "数据点数量: 2409, 模型保存至: ./../../model\\lightgbm_model_601901.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601916 (148/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1292, 230), 目标变量形状: (1292,)\n",
      "  特征矩阵形状: (1292, 230), 目标变量形状: (1292,)\n",
      "股票 601916 训练完成，MSE损失: 0.000336\n",
      "数据点数量: 1292, 模型保存至: ./../../model\\lightgbm_model_601916.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601919 (149/300)\n",
      "==================================================\n",
      "股票 601916 训练完成，MSE损失: 0.000336\n",
      "数据点数量: 1292, 模型保存至: ./../../model\\lightgbm_model_601916.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601919 (149/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2279, 230), 目标变量形状: (2279,)\n",
      "  特征矩阵形状: (2279, 230), 目标变量形状: (2279,)\n",
      "股票 601919 训练完成，MSE损失: 0.028405\n",
      "数据点数量: 2279, 模型保存至: ./../../model\\lightgbm_model_601919.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601939 (150/300)\n",
      "==================================================\n",
      "股票 601919 训练完成，MSE损失: 0.028405\n",
      "数据点数量: 2279, 模型保存至: ./../../model\\lightgbm_model_601919.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601939 (150/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601939 训练完成，MSE损失: 0.003758\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601939.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601985 (151/300)\n",
      "==================================================\n",
      "股票 601939 训练完成，MSE损失: 0.003758\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601939.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601985 (151/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2386, 230), 目标变量形状: (2386,)\n",
      "  特征矩阵形状: (2386, 230), 目标变量形状: (2386,)\n",
      "股票 601985 训练完成，MSE损失: 0.008275\n",
      "数据点数量: 2386, 模型保存至: ./../../model\\lightgbm_model_601985.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601988 (152/300)\n",
      "==================================================\n",
      "股票 601985 训练完成，MSE损失: 0.008275\n",
      "数据点数量: 2386, 模型保存至: ./../../model\\lightgbm_model_601985.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601988 (152/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 601988 训练完成，MSE损失: 0.000989\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601988.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601989 (153/300)\n",
      "==================================================\n",
      "股票 601988 训练完成，MSE损失: 0.000989\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_601988.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601989 (153/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2276, 230), 目标变量形状: (2276,)\n",
      "  特征矩阵形状: (2276, 230), 目标变量形状: (2276,)\n",
      "股票 601989 训练完成，MSE损失: 0.019863\n",
      "数据点数量: 2276, 模型保存至: ./../../model\\lightgbm_model_601989.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601995 (154/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1073, 230), 目标变量形状: (1073,)\n",
      "股票 601989 训练完成，MSE损失: 0.019863\n",
      "数据点数量: 2276, 模型保存至: ./../../model\\lightgbm_model_601989.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601995 (154/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1073, 230), 目标变量形状: (1073,)\n",
      "股票 601995 训练完成，MSE损失: 0.302900\n",
      "数据点数量: 1073, 模型保存至: ./../../model\\lightgbm_model_601995.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601998 (155/300)\n",
      "==================================================\n",
      "股票 601995 训练完成，MSE损失: 0.302900\n",
      "数据点数量: 1073, 模型保存至: ./../../model\\lightgbm_model_601995.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 601998 (155/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2420, 230), 目标变量形状: (2420,)\n",
      "  特征矩阵形状: (2420, 230), 目标变量形状: (2420,)\n",
      "股票 601998 训练完成，MSE损失: 0.004244\n",
      "数据点数量: 2420, 模型保存至: ./../../model\\lightgbm_model_601998.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603019 (156/300)\n",
      "==================================================\n",
      "股票 601998 训练完成，MSE损失: 0.004244\n",
      "数据点数量: 2420, 模型保存至: ./../../model\\lightgbm_model_601998.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603019 (156/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "股票 603019 训练完成，MSE损失: 0.462563\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_603019.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603195 (157/300)\n",
      "==================================================\n",
      "股票 603019 训练完成，MSE损失: 0.462563\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_603019.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603195 (157/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1253, 230), 目标变量形状: (1253,)\n",
      "  特征矩阵形状: (1253, 230), 目标变量形状: (1253,)\n",
      "股票 603195 训练完成，MSE损失: 0.802849\n",
      "数据点数量: 1253, 模型保存至: ./../../model\\lightgbm_model_603195.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603259 (158/300)\n",
      "==================================================\n",
      "股票 603195 训练完成，MSE损失: 0.802849\n",
      "数据点数量: 1253, 模型保存至: ./../../model\\lightgbm_model_603195.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603259 (158/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1678, 230), 目标变量形状: (1678,)\n",
      "  特征矩阵形状: (1678, 230), 目标变量形状: (1678,)\n",
      "股票 603259 训练完成，MSE损失: 1.677783\n",
      "数据点数量: 1678, 模型保存至: ./../../model\\lightgbm_model_603259.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603260 (159/300)\n",
      "==================================================\n",
      "股票 603259 训练完成，MSE损失: 1.677783\n",
      "数据点数量: 1678, 模型保存至: ./../../model\\lightgbm_model_603259.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603260 (159/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1804, 230), 目标变量形状: (1804,)\n",
      "  特征矩阵形状: (1804, 230), 目标变量形状: (1804,)\n",
      "股票 603260 训练完成，MSE损失: 2.732112\n",
      "数据点数量: 1804, 模型保存至: ./../../model\\lightgbm_model_603260.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603288 (160/300)\n",
      "==================================================\n",
      "股票 603260 训练完成，MSE损失: 2.732112\n",
      "数据点数量: 1804, 模型保存至: ./../../model\\lightgbm_model_603260.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603288 (160/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 603288 训练完成，MSE损失: 0.533318\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_603288.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603296 (161/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (400, 230), 目标变量形状: (400,)\n",
      "股票 603296 训练完成，MSE损失: 1.659750\n",
      "数据点数量: 400, 模型保存至: ./../../model\\lightgbm_model_603296.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603369 (162/300)\n",
      "==================================================\n",
      "股票 603288 训练完成，MSE损失: 0.533318\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_603288.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603296 (161/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (400, 230), 目标变量形状: (400,)\n",
      "股票 603296 训练完成，MSE损失: 1.659750\n",
      "数据点数量: 400, 模型保存至: ./../../model\\lightgbm_model_603296.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603369 (162/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "股票 603369 训练完成，MSE损失: 0.352498\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_603369.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603392 (163/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1195, 230), 目标变量形状: (1195,)\n",
      "股票 603369 训练完成，MSE损失: 0.352498\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_603369.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603392 (163/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1195, 230), 目标变量形状: (1195,)\n",
      "股票 603392 训练完成，MSE损失: 2.480562\n",
      "数据点数量: 1195, 模型保存至: ./../../model\\lightgbm_model_603392.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603501 (164/300)\n",
      "==================================================\n",
      "股票 603392 训练完成，MSE损失: 2.480562\n",
      "数据点数量: 1195, 模型保存至: ./../../model\\lightgbm_model_603392.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603501 (164/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1753, 230), 目标变量形状: (1753,)\n",
      "  特征矩阵形状: (1753, 230), 目标变量形状: (1753,)\n",
      "股票 603501 训练完成，MSE损失: 4.014716\n",
      "数据点数量: 1753, 模型保存至: ./../../model\\lightgbm_model_603501.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603659 (165/300)\n",
      "==================================================\n",
      "股票 603501 训练完成，MSE损失: 4.014716\n",
      "数据点数量: 1753, 模型保存至: ./../../model\\lightgbm_model_603501.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603659 (165/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1744, 230), 目标变量形状: (1744,)\n",
      "  特征矩阵形状: (1744, 230), 目标变量形状: (1744,)\n",
      "股票 603659 训练完成，MSE损失: 0.271832\n",
      "数据点数量: 1744, 模型保存至: ./../../model\\lightgbm_model_603659.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603799 (166/300)\n",
      "==================================================\n",
      "股票 603659 训练完成，MSE损失: 0.271832\n",
      "数据点数量: 1744, 模型保存至: ./../../model\\lightgbm_model_603659.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603799 (166/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2388, 230), 目标变量形状: (2388,)\n",
      "  特征矩阵形状: (2388, 230), 目标变量形状: (2388,)\n",
      "股票 603799 训练完成，MSE损失: 0.888988\n",
      "数据点数量: 2388, 模型保存至: ./../../model\\lightgbm_model_603799.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603806 (167/300)\n",
      "==================================================\n",
      "股票 603799 训练完成，MSE损失: 0.888988\n",
      "数据点数量: 2388, 模型保存至: ./../../model\\lightgbm_model_603799.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603806 (167/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2403, 230), 目标变量形状: (2403,)\n",
      "  特征矩阵形状: (2403, 230), 目标变量形状: (2403,)\n",
      "股票 603806 训练完成，MSE损失: 0.160147\n",
      "数据点数量: 2403, 模型保存至: ./../../model\\lightgbm_model_603806.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603833 (168/300)\n",
      "==================================================\n",
      "股票 603806 训练完成，MSE损失: 0.160147\n",
      "数据点数量: 2403, 模型保存至: ./../../model\\lightgbm_model_603806.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603833 (168/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1942, 230), 目标变量形状: (1942,)\n",
      "  特征矩阵形状: (1942, 230), 目标变量形状: (1942,)\n",
      "股票 603833 训练完成，MSE损失: 2.188385\n",
      "数据点数量: 1942, 模型保存至: ./../../model\\lightgbm_model_603833.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603986 (169/300)\n",
      "==================================================\n",
      "股票 603833 训练完成，MSE损失: 2.188385\n",
      "数据点数量: 1942, 模型保存至: ./../../model\\lightgbm_model_603833.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603986 (169/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1887, 230), 目标变量形状: (1887,)\n",
      "  特征矩阵形状: (1887, 230), 目标变量形状: (1887,)\n",
      "股票 603986 训练完成，MSE损失: 4.931456\n",
      "数据点数量: 1887, 模型保存至: ./../../model\\lightgbm_model_603986.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603993 (170/300)\n",
      "==================================================\n",
      "股票 603986 训练完成，MSE损失: 4.931456\n",
      "数据点数量: 1887, 模型保存至: ./../../model\\lightgbm_model_603986.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 603993 (170/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2403, 230), 目标变量形状: (2403,)\n",
      "  特征矩阵形状: (2403, 230), 目标变量形状: (2403,)\n",
      "股票 603993 训练完成，MSE损失: 0.010717\n",
      "数据点数量: 2403, 模型保存至: ./../../model\\lightgbm_model_603993.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 605117 (171/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (959, 230), 目标变量形状: (959,)\n",
      "股票 603993 训练完成，MSE损失: 0.010717\n",
      "数据点数量: 2403, 模型保存至: ./../../model\\lightgbm_model_603993.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 605117 (171/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (959, 230), 目标变量形状: (959,)\n",
      "股票 605117 训练完成，MSE损失: 2.719530\n",
      "数据点数量: 959, 模型保存至: ./../../model\\lightgbm_model_605117.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 605499 (172/300)\n",
      "==================================================\n",
      "股票 605117 训练完成，MSE损失: 2.719530\n",
      "数据点数量: 959, 模型保存至: ./../../model\\lightgbm_model_605117.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 605499 (172/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (935, 230), 目标变量形状: (935,)\n",
      "  特征矩阵形状: (935, 230), 目标变量形状: (935,)\n",
      "股票 605499 训练完成，MSE损失: 4.077952\n",
      "数据点数量: 935, 模型保存至: ./../../model\\lightgbm_model_605499.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688008 (173/300)\n",
      "==================================================\n",
      "股票 605499 训练完成，MSE损失: 4.077952\n",
      "数据点数量: 935, 模型保存至: ./../../model\\lightgbm_model_605499.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688008 (173/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1383, 230), 目标变量形状: (1383,)\n",
      "  特征矩阵形状: (1383, 230), 目标变量形状: (1383,)\n",
      "股票 688008 训练完成，MSE损失: 1.573616\n",
      "数据点数量: 1383, 模型保存至: ./../../model\\lightgbm_model_688008.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688009 (174/300)\n",
      "==================================================\n",
      "股票 688008 训练完成，MSE损失: 1.573616\n",
      "数据点数量: 1383, 模型保存至: ./../../model\\lightgbm_model_688008.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688009 (174/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1383, 230), 目标变量形状: (1383,)\n",
      "  特征矩阵形状: (1383, 230), 目标变量形状: (1383,)\n",
      "股票 688009 训练完成，MSE损失: 0.007868\n",
      "数据点数量: 1383, 模型保存至: ./../../model\\lightgbm_model_688009.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688012 (175/300)\n",
      "==================================================\n",
      "股票 688009 训练完成，MSE损失: 0.007868\n",
      "数据点数量: 1383, 模型保存至: ./../../model\\lightgbm_model_688009.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688012 (175/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1383, 230), 目标变量形状: (1383,)\n",
      "  特征矩阵形状: (1383, 230), 目标变量形状: (1383,)\n",
      "股票 688012 训练完成，MSE损失: 10.402017\n",
      "数据点数量: 1383, 模型保存至: ./../../model\\lightgbm_model_688012.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688036 (176/300)\n",
      "==================================================\n",
      "股票 688012 训练完成，MSE损失: 10.402017\n",
      "数据点数量: 1383, 模型保存至: ./../../model\\lightgbm_model_688012.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688036 (176/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1334, 230), 目标变量形状: (1334,)\n",
      "  特征矩阵形状: (1334, 230), 目标变量形状: (1334,)\n",
      "股票 688036 训练完成，MSE损失: 3.222935\n",
      "数据点数量: 1334, 模型保存至: ./../../model\\lightgbm_model_688036.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688041 (177/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (639, 230), 目标变量形状: (639,)\n",
      "股票 688036 训练完成，MSE损失: 3.222935\n",
      "数据点数量: 1334, 模型保存至: ./../../model\\lightgbm_model_688036.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688041 (177/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (639, 230), 目标变量形状: (639,)\n",
      "股票 688041 训练完成，MSE损失: 2.791276\n",
      "数据点数量: 639, 模型保存至: ./../../model\\lightgbm_model_688041.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688082 (178/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (818, 230), 目标变量形状: (818,)\n",
      "股票 688041 训练完成，MSE损失: 2.791276\n",
      "数据点数量: 639, 模型保存至: ./../../model\\lightgbm_model_688041.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688082 (178/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (818, 230), 目标变量形状: (818,)\n",
      "股票 688082 训练完成，MSE损失: 2.604946\n",
      "数据点数量: 818, 模型保存至: ./../../model\\lightgbm_model_688082.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688111 (179/300)\n",
      "==================================================\n",
      "股票 688082 训练完成，MSE损失: 2.604946\n",
      "数据点数量: 818, 模型保存至: ./../../model\\lightgbm_model_688082.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688111 (179/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1304, 230), 目标变量形状: (1304,)\n",
      "  特征矩阵形状: (1304, 230), 目标变量形状: (1304,)\n",
      "股票 688111 训练完成，MSE损失: 31.345327\n",
      "数据点数量: 1304, 模型保存至: ./../../model\\lightgbm_model_688111.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688126 (180/300)\n",
      "==================================================\n",
      "股票 688111 训练完成，MSE损失: 31.345327\n",
      "数据点数量: 1304, 模型保存至: ./../../model\\lightgbm_model_688111.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688126 (180/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1192, 230), 目标变量形状: (1192,)\n",
      "  特征矩阵形状: (1192, 230), 目标变量形状: (1192,)\n",
      "股票 688126 训练完成，MSE损失: 0.416785\n",
      "数据点数量: 1192, 模型保存至: ./../../model\\lightgbm_model_688126.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688169 (181/300)\n",
      "==================================================\n",
      "股票 688126 训练完成，MSE损失: 0.416785\n",
      "数据点数量: 1192, 模型保存至: ./../../model\\lightgbm_model_688126.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688169 (181/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1242, 230), 目标变量形状: (1242,)\n",
      "  特征矩阵形状: (1242, 230), 目标变量形状: (1242,)\n",
      "股票 688169 训练完成，MSE损失: 26.700625\n",
      "数据点数量: 1242, 模型保存至: ./../../model\\lightgbm_model_688169.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688187 (182/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (863, 230), 目标变量形状: (863,)\n",
      "股票 688169 训练完成，MSE损失: 26.700625\n",
      "数据点数量: 1242, 模型保存至: ./../../model\\lightgbm_model_688169.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688187 (182/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (863, 230), 目标变量形状: (863,)\n",
      "股票 688187 训练完成，MSE损失: 0.721266\n",
      "数据点数量: 863, 模型保存至: ./../../model\\lightgbm_model_688187.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688223 (183/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (770, 230), 目标变量形状: (770,)\n",
      "股票 688187 训练完成，MSE损失: 0.721266\n",
      "数据点数量: 863, 模型保存至: ./../../model\\lightgbm_model_688187.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688223 (183/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (770, 230), 目标变量形状: (770,)\n",
      "股票 688223 训练完成，MSE损失: 0.028980\n",
      "数据点数量: 770, 模型保存至: ./../../model\\lightgbm_model_688223.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688256 (184/300)\n",
      "==================================================\n",
      "股票 688223 训练完成，MSE损失: 0.028980\n",
      "数据点数量: 770, 模型保存至: ./../../model\\lightgbm_model_688223.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688256 (184/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1142, 230), 目标变量形状: (1142,)\n",
      "  特征矩阵形状: (1142, 230), 目标变量形状: (1142,)\n",
      "股票 688256 训练完成，MSE损失: 40.311166\n",
      "数据点数量: 1142, 模型保存至: ./../../model\\lightgbm_model_688256.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688271 (185/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (633, 230), 目标变量形状: (633,)\n",
      "股票 688256 训练完成，MSE损失: 40.311166\n",
      "数据点数量: 1142, 模型保存至: ./../../model\\lightgbm_model_688256.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688271 (185/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (633, 230), 目标变量形状: (633,)\n",
      "股票 688271 训练完成，MSE损失: 3.095963\n",
      "数据点数量: 633, 模型保存至: ./../../model\\lightgbm_model_688271.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688303 (186/300)\n",
      "==================================================\n",
      "股票 688271 训练完成，MSE损失: 3.095963\n",
      "数据点数量: 633, 模型保存至: ./../../model\\lightgbm_model_688271.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688303 (186/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (896, 230), 目标变量形状: (896,)\n",
      "  特征矩阵形状: (896, 230), 目标变量形状: (896,)\n",
      "股票 688303 训练完成，MSE损失: 0.627297\n",
      "数据点数量: 896, 模型保存至: ./../../model\\lightgbm_model_688303.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688396 (187/300)\n",
      "==================================================\n",
      "股票 688303 训练完成，MSE损失: 0.627297\n",
      "数据点数量: 896, 模型保存至: ./../../model\\lightgbm_model_688303.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688396 (187/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1238, 230), 目标变量形状: (1238,)\n",
      "  特征矩阵形状: (1238, 230), 目标变量形状: (1238,)\n",
      "股票 688396 训练完成，MSE损失: 0.708194\n",
      "数据点数量: 1238, 模型保存至: ./../../model\\lightgbm_model_688396.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688472 (188/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (440, 230), 目标变量形状: (440,)\n",
      "股票 688396 训练完成，MSE损失: 0.708194\n",
      "数据点数量: 1238, 模型保存至: ./../../model\\lightgbm_model_688396.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688472 (188/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (440, 230), 目标变量形状: (440,)\n",
      "股票 688472 训练完成，MSE损失: 0.058317\n",
      "数据点数量: 440, 模型保存至: ./../../model\\lightgbm_model_688472.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688506 (189/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (541, 230), 目标变量形状: (541,)\n",
      "股票 688472 训练完成，MSE损失: 0.058317\n",
      "数据点数量: 440, 模型保存至: ./../../model\\lightgbm_model_688472.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688506 (189/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (541, 230), 目标变量形状: (541,)\n",
      "股票 688506 训练完成，MSE损失: 10.656390\n",
      "数据点数量: 541, 模型保存至: ./../../model\\lightgbm_model_688506.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688599 (190/300)\n",
      "==================================================\n",
      "股票 688506 训练完成，MSE损失: 10.656390\n",
      "数据点数量: 541, 模型保存至: ./../../model\\lightgbm_model_688506.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688599 (190/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1168, 230), 目标变量形状: (1168,)\n",
      "  特征矩阵形状: (1168, 230), 目标变量形状: (1168,)\n",
      "股票 688599 训练完成，MSE损失: 0.665834\n",
      "数据点数量: 1168, 模型保存至: ./../../model\\lightgbm_model_688599.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688981 (191/300)\n",
      "==================================================\n",
      "股票 688599 训练完成，MSE损失: 0.665834\n",
      "数据点数量: 1168, 模型保存至: ./../../model\\lightgbm_model_688599.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 688981 (191/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1144, 230), 目标变量形状: (1144,)\n",
      "  特征矩阵形状: (1144, 230), 目标变量形状: (1144,)\n",
      "股票 688981 训练完成，MSE损失: 0.749099\n",
      "数据点数量: 1144, 模型保存至: ./../../model\\lightgbm_model_688981.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 1 (192/300)\n",
      "==================================================\n",
      "股票 688981 训练完成，MSE损失: 0.749099\n",
      "数据点数量: 1144, 模型保存至: ./../../model\\lightgbm_model_688981.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 1 (192/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 1 训练完成，MSE损失: 0.027952\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_1.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2 (193/300)\n",
      "==================================================\n",
      "股票 1 训练完成，MSE损失: 0.027952\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_1.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2 (193/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2287, 230), 目标变量形状: (2287,)\n",
      "  特征矩阵形状: (2287, 230), 目标变量形状: (2287,)\n",
      "股票 2 训练完成，MSE损失: 0.111272\n",
      "数据点数量: 2287, 模型保存至: ./../../model\\lightgbm_model_2.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 63 (194/300)\n",
      "==================================================\n",
      "股票 2 训练完成，MSE损失: 0.111272\n",
      "数据点数量: 2287, 模型保存至: ./../../model\\lightgbm_model_2.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 63 (194/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2348, 230), 目标变量形状: (2348,)\n",
      "  特征矩阵形状: (2348, 230), 目标变量形状: (2348,)\n",
      "股票 63 训练完成，MSE损失: 0.281608\n",
      "数据点数量: 2348, 模型保存至: ./../../model\\lightgbm_model_63.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 100 (195/300)\n",
      "==================================================\n",
      "股票 63 训练完成，MSE损失: 0.281608\n",
      "数据点数量: 2348, 模型保存至: ./../../model\\lightgbm_model_63.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 100 (195/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2256, 230), 目标变量形状: (2256,)\n",
      "  特征矩阵形状: (2256, 230), 目标变量形状: (2256,)\n",
      "股票 100 训练完成，MSE损失: 0.005440\n",
      "数据点数量: 2256, 模型保存至: ./../../model\\lightgbm_model_100.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 157 (196/300)\n",
      "==================================================\n",
      "股票 100 训练完成，MSE损失: 0.005440\n",
      "数据点数量: 2256, 模型保存至: ./../../model\\lightgbm_model_100.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 157 (196/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "股票 157 训练完成，MSE损失: 0.011390\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_157.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 166 (197/300)\n",
      "==================================================\n",
      "股票 157 训练完成，MSE损失: 0.011390\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_157.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 166 (197/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2392, 230), 目标变量形状: (2392,)\n",
      "  特征矩阵形状: (2392, 230), 目标变量形状: (2392,)\n",
      "股票 166 训练完成，MSE损失: 0.006089\n",
      "数据点数量: 2392, 模型保存至: ./../../model\\lightgbm_model_166.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 301 (198/300)\n",
      "==================================================\n",
      "股票 166 训练完成，MSE损失: 0.006089\n",
      "数据点数量: 2392, 模型保存至: ./../../model\\lightgbm_model_166.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 301 (198/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2246, 230), 目标变量形状: (2246,)\n",
      "  特征矩阵形状: (2246, 230), 目标变量形状: (2246,)\n",
      "股票 301 训练完成，MSE损失: 0.083435\n",
      "数据点数量: 2246, 模型保存至: ./../../model\\lightgbm_model_301.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 333 (199/300)\n",
      "==================================================\n",
      "股票 301 训练完成，MSE损失: 0.083435\n",
      "数据点数量: 2246, 模型保存至: ./../../model\\lightgbm_model_301.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 333 (199/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2372, 230), 目标变量形状: (2372,)\n",
      "  特征矩阵形状: (2372, 230), 目标变量形状: (2372,)\n",
      "股票 333 训练完成，MSE损失: 0.539894\n",
      "数据点数量: 2372, 模型保存至: ./../../model\\lightgbm_model_333.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 338 (200/300)\n",
      "==================================================\n",
      "股票 333 训练完成，MSE损失: 0.539894\n",
      "数据点数量: 2372, 模型保存至: ./../../model\\lightgbm_model_333.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 338 (200/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2420, 230), 目标变量形状: (2420,)\n",
      "  特征矩阵形状: (2420, 230), 目标变量形状: (2420,)\n",
      "股票 338 训练完成，MSE损失: 0.034045\n",
      "数据点数量: 2420, 模型保存至: ./../../model\\lightgbm_model_338.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 408 (201/300)\n",
      "==================================================\n",
      "股票 338 训练完成，MSE损失: 0.034045\n",
      "数据点数量: 2420, 模型保存至: ./../../model\\lightgbm_model_338.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 408 (201/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2360, 230), 目标变量形状: (2360,)\n",
      "  特征矩阵形状: (2360, 230), 目标变量形状: (2360,)\n",
      "股票 408 训练完成，MSE损失: 0.137461\n",
      "数据点数量: 2360, 模型保存至: ./../../model\\lightgbm_model_408.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 425 (202/300)\n",
      "==================================================\n",
      "股票 408 训练完成，MSE损失: 0.137461\n",
      "数据点数量: 2360, 模型保存至: ./../../model\\lightgbm_model_408.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 425 (202/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2382, 230), 目标变量形状: (2382,)\n",
      "  特征矩阵形状: (2382, 230), 目标变量形状: (2382,)\n",
      "股票 425 训练完成，MSE损失: 0.006108\n",
      "数据点数量: 2382, 模型保存至: ./../../model\\lightgbm_model_425.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 538 (203/300)\n",
      "==================================================\n",
      "股票 425 训练完成，MSE损失: 0.006108\n",
      "数据点数量: 2382, 模型保存至: ./../../model\\lightgbm_model_425.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 538 (203/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2258, 230), 目标变量形状: (2258,)\n",
      "  特征矩阵形状: (2258, 230), 目标变量形状: (2258,)\n",
      "股票 538 训练完成，MSE损失: 0.770567\n",
      "数据点数量: 2258, 模型保存至: ./../../model\\lightgbm_model_538.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 568 (204/300)\n",
      "==================================================\n",
      "股票 538 训练完成，MSE损失: 0.770567\n",
      "数据点数量: 2258, 模型保存至: ./../../model\\lightgbm_model_538.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 568 (204/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2404, 230), 目标变量形状: (2404,)\n",
      "  特征矩阵形状: (2404, 230), 目标变量形状: (2404,)\n",
      "股票 568 训练完成，MSE损失: 5.159583\n",
      "数据点数量: 2404, 模型保存至: ./../../model\\lightgbm_model_568.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 596 (205/300)\n",
      "==================================================\n",
      "股票 568 训练完成，MSE损失: 5.159583\n",
      "数据点数量: 2404, 模型保存至: ./../../model\\lightgbm_model_568.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 596 (205/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 596 训练完成，MSE损失: 6.543719\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_596.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 617 (206/300)\n",
      "==================================================\n",
      "股票 596 训练完成，MSE损失: 6.543719\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_596.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 617 (206/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2313, 230), 目标变量形状: (2313,)\n",
      "  特征矩阵形状: (2313, 230), 目标变量形状: (2313,)\n",
      "股票 617 训练完成，MSE损失: 0.019677\n",
      "数据点数量: 2313, 模型保存至: ./../../model\\lightgbm_model_617.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 625 (207/300)\n",
      "==================================================\n",
      "股票 617 训练完成，MSE损失: 0.019677\n",
      "数据点数量: 2313, 模型保存至: ./../../model\\lightgbm_model_617.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 625 (207/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2399, 230), 目标变量形状: (2399,)\n",
      "  特征矩阵形状: (2399, 230), 目标变量形状: (2399,)\n",
      "股票 625 训练完成，MSE损失: 0.036140\n",
      "数据点数量: 2399, 模型保存至: ./../../model\\lightgbm_model_625.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 630 (208/300)\n",
      "==================================================\n",
      "股票 625 训练完成，MSE损失: 0.036140\n",
      "数据点数量: 2399, 模型保存至: ./../../model\\lightgbm_model_625.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 630 (208/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2287, 230), 目标变量形状: (2287,)\n",
      "  特征矩阵形状: (2287, 230), 目标变量形状: (2287,)\n",
      "股票 630 训练完成，MSE损失: 0.002172\n",
      "数据点数量: 2287, 模型保存至: ./../../model\\lightgbm_model_630.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 651 (209/300)\n",
      "==================================================\n",
      "股票 630 训练完成，MSE损失: 0.002172\n",
      "数据点数量: 2287, 模型保存至: ./../../model\\lightgbm_model_630.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 651 (209/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2265, 230), 目标变量形状: (2265,)\n",
      "  特征矩阵形状: (2265, 230), 目标变量形状: (2265,)\n",
      "股票 651 训练完成，MSE损失: 0.295324\n",
      "数据点数量: 2265, 模型保存至: ./../../model\\lightgbm_model_651.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 661 (210/300)\n",
      "==================================================\n",
      "股票 651 训练完成，MSE损失: 0.295324\n",
      "数据点数量: 2265, 模型保存至: ./../../model\\lightgbm_model_651.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 661 (210/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2407, 230), 目标变量形状: (2407,)\n",
      "  特征矩阵形状: (2407, 230), 目标变量形状: (2407,)\n",
      "股票 661 训练完成，MSE损失: 10.104151\n",
      "数据点数量: 2407, 模型保存至: ./../../model\\lightgbm_model_661.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 708 (211/300)\n",
      "==================================================\n",
      "股票 661 训练完成，MSE损失: 10.104151\n",
      "数据点数量: 2407, 模型保存至: ./../../model\\lightgbm_model_661.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 708 (211/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2310, 230), 目标变量形状: (2310,)\n",
      "  特征矩阵形状: (2310, 230), 目标变量形状: (2310,)\n",
      "股票 708 训练完成，MSE损失: 0.060640\n",
      "数据点数量: 2310, 模型保存至: ./../../model\\lightgbm_model_708.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 725 (212/300)\n",
      "==================================================\n",
      "股票 708 训练完成，MSE损失: 0.060640\n",
      "数据点数量: 2310, 模型保存至: ./../../model\\lightgbm_model_708.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 725 (212/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2418, 230), 目标变量形状: (2418,)\n",
      "  特征矩阵形状: (2418, 230), 目标变量形状: (2418,)\n",
      "股票 725 训练完成，MSE损失: 0.003977\n",
      "数据点数量: 2418, 模型保存至: ./../../model\\lightgbm_model_725.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 768 (213/300)\n",
      "==================================================\n",
      "股票 725 训练完成，MSE损失: 0.003977\n",
      "数据点数量: 2418, 模型保存至: ./../../model\\lightgbm_model_725.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 768 (213/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2417, 230), 目标变量形状: (2417,)\n",
      "  特征矩阵形状: (2417, 230), 目标变量形状: (2417,)\n",
      "股票 768 训练完成，MSE损失: 0.194335\n",
      "数据点数量: 2417, 模型保存至: ./../../model\\lightgbm_model_768.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 776 (214/300)\n",
      "==================================================\n",
      "股票 768 训练完成，MSE损失: 0.194335\n",
      "数据点数量: 2417, 模型保存至: ./../../model\\lightgbm_model_768.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 776 (214/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 776 训练完成，MSE损失: 0.055074\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_776.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 786 (215/300)\n",
      "==================================================\n",
      "股票 776 训练完成，MSE损失: 0.055074\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_776.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 786 (215/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2289, 230), 目标变量形状: (2289,)\n",
      "  特征矩阵形状: (2289, 230), 目标变量形状: (2289,)\n",
      "股票 786 训练完成，MSE损失: 0.190220\n",
      "数据点数量: 2289, 模型保存至: ./../../model\\lightgbm_model_786.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 792 (216/300)\n",
      "==================================================\n",
      "股票 786 训练完成，MSE损失: 0.190220\n",
      "数据点数量: 2289, 模型保存至: ./../../model\\lightgbm_model_786.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 792 (216/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2098, 230), 目标变量形状: (2098,)\n",
      "  特征矩阵形状: (2098, 230), 目标变量形状: (2098,)\n",
      "股票 792 训练完成，MSE损失: 0.305001\n",
      "数据点数量: 2098, 模型保存至: ./../../model\\lightgbm_model_792.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 800 (217/300)\n",
      "==================================================\n",
      "股票 792 训练完成，MSE损失: 0.305001\n",
      "数据点数量: 2098, 模型保存至: ./../../model\\lightgbm_model_792.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 800 (217/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2408, 230), 目标变量形状: (2408,)\n",
      "  特征矩阵形状: (2408, 230), 目标变量形状: (2408,)\n",
      "股票 800 训练完成，MSE损失: 0.053223\n",
      "数据点数量: 2408, 模型保存至: ./../../model\\lightgbm_model_800.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 807 (218/300)\n",
      "==================================================\n",
      "股票 800 训练完成，MSE损失: 0.053223\n",
      "数据点数量: 2408, 模型保存至: ./../../model\\lightgbm_model_800.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 807 (218/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2389, 230), 目标变量形状: (2389,)\n",
      "  特征矩阵形状: (2389, 230), 目标变量形状: (2389,)\n",
      "股票 807 训练完成，MSE损失: 0.045410\n",
      "数据点数量: 2389, 模型保存至: ./../../model\\lightgbm_model_807.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 858 (219/300)\n",
      "==================================================\n",
      "股票 807 训练完成，MSE损失: 0.045410\n",
      "数据点数量: 2389, 模型保存至: ./../../model\\lightgbm_model_807.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 858 (219/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2362, 230), 目标变量形状: (2362,)\n",
      "  特征矩阵形状: (2362, 230), 目标变量形状: (2362,)\n",
      "股票 858 训练完成，MSE损失: 4.682143\n",
      "数据点数量: 2362, 模型保存至: ./../../model\\lightgbm_model_858.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 876 (220/300)\n",
      "==================================================\n",
      "股票 858 训练完成，MSE损失: 4.682143\n",
      "数据点数量: 2362, 模型保存至: ./../../model\\lightgbm_model_858.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 876 (220/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2287, 230), 目标变量形状: (2287,)\n",
      "  特征矩阵形状: (2287, 230), 目标变量形状: (2287,)\n",
      "股票 876 训练完成，MSE损失: 0.065866\n",
      "数据点数量: 2287, 模型保存至: ./../../model\\lightgbm_model_876.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 895 (221/300)\n",
      "==================================================\n",
      "股票 876 训练完成，MSE损失: 0.065866\n",
      "数据点数量: 2287, 模型保存至: ./../../model\\lightgbm_model_876.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 895 (221/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2407, 230), 目标变量形状: (2407,)\n",
      "  特征矩阵形状: (2407, 230), 目标变量形状: (2407,)\n",
      "股票 895 训练完成，MSE损失: 0.173591\n",
      "数据点数量: 2407, 模型保存至: ./../../model\\lightgbm_model_895.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 938 (222/300)\n",
      "==================================================\n",
      "股票 895 训练完成，MSE损失: 0.173591\n",
      "数据点数量: 2407, 模型保存至: ./../../model\\lightgbm_model_895.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 938 (222/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2348, 230), 目标变量形状: (2348,)\n",
      "  特征矩阵形状: (2348, 230), 目标变量形状: (2348,)\n",
      "股票 938 训练完成，MSE损失: 0.237414\n",
      "数据点数量: 2348, 模型保存至: ./../../model\\lightgbm_model_938.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 963 (223/300)\n",
      "==================================================\n",
      "股票 938 训练完成，MSE损失: 0.237414\n",
      "数据点数量: 2348, 模型保存至: ./../../model\\lightgbm_model_938.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 963 (223/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2394, 230), 目标变量形状: (2394,)\n",
      "  特征矩阵形状: (2394, 230), 目标变量形状: (2394,)\n",
      "股票 963 训练完成，MSE损失: 0.255270\n",
      "数据点数量: 2394, 模型保存至: ./../../model\\lightgbm_model_963.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 975 (224/300)\n",
      "==================================================\n",
      "股票 963 训练完成，MSE损失: 0.255270\n",
      "数据点数量: 2394, 模型保存至: ./../../model\\lightgbm_model_963.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 975 (224/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2248, 230), 目标变量形状: (2248,)\n",
      "  特征矩阵形状: (2248, 230), 目标变量形状: (2248,)\n",
      "股票 975 训练完成，MSE损失: 0.038591\n",
      "数据点数量: 2248, 模型保存至: ./../../model\\lightgbm_model_975.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 977 (225/300)\n",
      "==================================================\n",
      "股票 975 训练完成，MSE损失: 0.038591\n",
      "数据点数量: 2248, 模型保存至: ./../../model\\lightgbm_model_975.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 977 (225/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2406, 230), 目标变量形状: (2406,)\n",
      "  特征矩阵形状: (2406, 230), 目标变量形状: (2406,)\n",
      "股票 977 训练完成，MSE损失: 0.362905\n",
      "数据点数量: 2406, 模型保存至: ./../../model\\lightgbm_model_977.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 983 (226/300)\n",
      "==================================================\n",
      "股票 977 训练完成，MSE损失: 0.362905\n",
      "数据点数量: 2406, 模型保存至: ./../../model\\lightgbm_model_977.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 983 (226/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "股票 983 训练完成，MSE损失: 0.021193\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_983.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 999 (227/300)\n",
      "==================================================\n",
      "股票 983 训练完成，MSE损失: 0.021193\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_983.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 999 (227/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 999 训练完成，MSE损失: 0.167904\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_999.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 1289 (228/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (772, 230), 目标变量形状: (772,)\n",
      "股票 999 训练完成，MSE损失: 0.167904\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_999.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 1289 (228/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (772, 230), 目标变量形状: (772,)\n",
      "股票 1289 训练完成，MSE损失: 0.061839\n",
      "数据点数量: 772, 模型保存至: ./../../model\\lightgbm_model_1289.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 1965 (229/300)\n",
      "==================================================\n",
      "股票 1289 训练完成，MSE损失: 0.061839\n",
      "数据点数量: 772, 模型保存至: ./../../model\\lightgbm_model_1289.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 1965 (229/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1764, 230), 目标变量形状: (1764,)\n",
      "  特征矩阵形状: (1764, 230), 目标变量形状: (1764,)\n",
      "股票 1965 训练完成，MSE损失: 0.007988\n",
      "数据点数量: 1764, 模型保存至: ./../../model\\lightgbm_model_1965.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 1979 (230/300)\n",
      "==================================================\n",
      "股票 1965 训练完成，MSE损失: 0.007988\n",
      "数据点数量: 1764, 模型保存至: ./../../model\\lightgbm_model_1965.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 1979 (230/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2233, 230), 目标变量形状: (2233,)\n",
      "  特征矩阵形状: (2233, 230), 目标变量形状: (2233,)\n",
      "股票 1979 训练完成，MSE损失: 0.046989\n",
      "数据点数量: 2233, 模型保存至: ./../../model\\lightgbm_model_1979.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2001 (231/300)\n",
      "==================================================\n",
      "股票 1979 训练完成，MSE损失: 0.046989\n",
      "数据点数量: 2233, 模型保存至: ./../../model\\lightgbm_model_1979.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2001 (231/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2408, 230), 目标变量形状: (2408,)\n",
      "  特征矩阵形状: (2408, 230), 目标变量形状: (2408,)\n",
      "股票 2001 训练完成，MSE损失: 0.059761\n",
      "数据点数量: 2408, 模型保存至: ./../../model\\lightgbm_model_2001.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2007 (232/300)\n",
      "==================================================\n",
      "股票 2001 训练完成，MSE损失: 0.059761\n",
      "数据点数量: 2408, 模型保存至: ./../../model\\lightgbm_model_2001.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2007 (232/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "  特征矩阵形状: (2419, 230), 目标变量形状: (2419,)\n",
      "股票 2007 训练完成，MSE损失: 0.223678\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_2007.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2027 (233/300)\n",
      "==================================================\n",
      "股票 2007 训练完成，MSE损失: 0.223678\n",
      "数据点数量: 2419, 模型保存至: ./../../model\\lightgbm_model_2007.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2027 (233/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2331, 230), 目标变量形状: (2331,)\n",
      "  特征矩阵形状: (2331, 230), 目标变量形状: (2331,)\n",
      "股票 2027 训练完成，MSE损失: 0.020027\n",
      "数据点数量: 2331, 模型保存至: ./../../model\\lightgbm_model_2027.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2028 (234/300)\n",
      "==================================================\n",
      "股票 2027 训练完成，MSE损失: 0.020027\n",
      "数据点数量: 2331, 模型保存至: ./../../model\\lightgbm_model_2027.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2028 (234/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 2028 训练完成，MSE损失: 0.244518\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2028.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2049 (235/300)\n",
      "==================================================\n",
      "股票 2028 训练完成，MSE损失: 0.244518\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2028.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2049 (235/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2227, 230), 目标变量形状: (2227,)\n",
      "  特征矩阵形状: (2227, 230), 目标变量形状: (2227,)\n",
      "股票 2049 训练完成，MSE损失: 1.836257\n",
      "数据点数量: 2227, 模型保存至: ./../../model\\lightgbm_model_2049.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2050 (236/300)\n",
      "==================================================\n",
      "股票 2049 训练完成，MSE损失: 1.836257\n",
      "数据点数量: 2227, 模型保存至: ./../../model\\lightgbm_model_2049.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2050 (236/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2372, 230), 目标变量形状: (2372,)\n",
      "  特征矩阵形状: (2372, 230), 目标变量形状: (2372,)\n",
      "股票 2050 训练完成，MSE损失: 0.095396\n",
      "数据点数量: 2372, 模型保存至: ./../../model\\lightgbm_model_2050.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2074 (237/300)\n",
      "==================================================\n",
      "股票 2050 训练完成，MSE损失: 0.095396\n",
      "数据点数量: 2372, 模型保存至: ./../../model\\lightgbm_model_2050.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2074 (237/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2389, 230), 目标变量形状: (2389,)\n",
      "  特征矩阵形状: (2389, 230), 目标变量形状: (2389,)\n",
      "股票 2074 训练完成，MSE损失: 0.299484\n",
      "数据点数量: 2389, 模型保存至: ./../../model\\lightgbm_model_2074.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2129 (238/300)\n",
      "==================================================\n",
      "股票 2074 训练完成，MSE损失: 0.299484\n",
      "数据点数量: 2389, 模型保存至: ./../../model\\lightgbm_model_2074.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2129 (238/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2003, 230), 目标变量形状: (2003,)\n",
      "  特征矩阵形状: (2003, 230), 目标变量形状: (2003,)\n",
      "股票 2129 训练完成，MSE损失: 0.142900\n",
      "数据点数量: 2003, 模型保存至: ./../../model\\lightgbm_model_2129.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2142 (239/300)\n",
      "==================================================\n",
      "股票 2129 训练完成，MSE损失: 0.142900\n",
      "数据点数量: 2003, 模型保存至: ./../../model\\lightgbm_model_2129.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2142 (239/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "  特征矩阵形状: (2415, 230), 目标变量形状: (2415,)\n",
      "股票 2142 训练完成，MSE损失: 0.094545\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_2142.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2179 (240/300)\n",
      "==================================================\n",
      "股票 2142 训练完成，MSE损失: 0.094545\n",
      "数据点数量: 2415, 模型保存至: ./../../model\\lightgbm_model_2142.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2179 (240/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 2179 训练完成，MSE损失: 0.187688\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2179.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2180 (241/300)\n",
      "==================================================\n",
      "股票 2179 训练完成，MSE损失: 0.187688\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2179.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2180 (241/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2280, 230), 目标变量形状: (2280,)\n",
      "  特征矩阵形状: (2280, 230), 目标变量形状: (2280,)\n",
      "股票 2180 训练完成，MSE损失: 0.344871\n",
      "数据点数量: 2280, 模型保存至: ./../../model\\lightgbm_model_2180.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2230 (242/300)\n",
      "==================================================\n",
      "股票 2180 训练完成，MSE损失: 0.344871\n",
      "数据点数量: 2280, 模型保存至: ./../../model\\lightgbm_model_2180.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2230 (242/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2365, 230), 目标变量形状: (2365,)\n",
      "  特征矩阵形状: (2365, 230), 目标变量形状: (2365,)\n",
      "股票 2230 训练完成，MSE损失: 0.538397\n",
      "数据点数量: 2365, 模型保存至: ./../../model\\lightgbm_model_2230.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2236 (243/300)\n",
      "==================================================\n",
      "股票 2230 训练完成，MSE损失: 0.538397\n",
      "数据点数量: 2365, 模型保存至: ./../../model\\lightgbm_model_2230.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2236 (243/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2417, 230), 目标变量形状: (2417,)\n",
      "  特征矩阵形状: (2417, 230), 目标变量形状: (2417,)\n",
      "股票 2236 训练完成，MSE损失: 0.104052\n",
      "数据点数量: 2417, 模型保存至: ./../../model\\lightgbm_model_2236.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2241 (244/300)\n",
      "==================================================\n",
      "股票 2236 训练完成，MSE损失: 0.104052\n",
      "数据点数量: 2417, 模型保存至: ./../../model\\lightgbm_model_2236.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2241 (244/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "股票 2241 训练完成，MSE损失: 0.204717\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_2241.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2252 (245/300)\n",
      "==================================================\n",
      "股票 2241 训练完成，MSE损失: 0.204717\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_2241.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2252 (245/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2107, 230), 目标变量形状: (2107,)\n",
      "  特征矩阵形状: (2107, 230), 目标变量形状: (2107,)\n",
      "股票 2252 训练完成，MSE损失: 0.022107\n",
      "数据点数量: 2107, 模型保存至: ./../../model\\lightgbm_model_2252.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2271 (246/300)\n",
      "==================================================\n",
      "股票 2252 训练完成，MSE损失: 0.022107\n",
      "数据点数量: 2107, 模型保存至: ./../../model\\lightgbm_model_2252.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2271 (246/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 2271 训练完成，MSE损失: 0.178479\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2271.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2304 (247/300)\n",
      "==================================================\n",
      "股票 2271 训练完成，MSE损失: 0.178479\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2271.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2304 (247/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 2304 训练完成，MSE损失: 4.193323\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2304.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2311 (248/300)\n",
      "==================================================\n",
      "股票 2304 训练完成，MSE损失: 4.193323\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2304.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2311 (248/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 2311 训练完成，MSE损失: 0.326646\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2311.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2352 (249/300)\n",
      "==================================================\n",
      "股票 2311 训练完成，MSE损失: 0.326646\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2311.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2352 (249/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2374, 230), 目标变量形状: (2374,)\n",
      "  特征矩阵形状: (2374, 230), 目标变量形状: (2374,)\n",
      "股票 2352 训练完成，MSE损失: 0.670420\n",
      "数据点数量: 2374, 模型保存至: ./../../model\\lightgbm_model_2352.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2371 (250/300)\n",
      "==================================================\n",
      "股票 2352 训练完成，MSE损失: 0.670420\n",
      "数据点数量: 2374, 模型保存至: ./../../model\\lightgbm_model_2352.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2371 (250/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2351, 230), 目标变量形状: (2351,)\n",
      "  特征矩阵形状: (2351, 230), 目标变量形状: (2351,)\n",
      "股票 2371 训练完成，MSE损失: 13.404902\n",
      "数据点数量: 2351, 模型保存至: ./../../model\\lightgbm_model_2371.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2415 (251/300)\n",
      "==================================================\n",
      "股票 2371 训练完成，MSE损失: 13.404902\n",
      "数据点数量: 2351, 模型保存至: ./../../model\\lightgbm_model_2371.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2415 (251/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2378, 230), 目标变量形状: (2378,)\n",
      "  特征矩阵形状: (2378, 230), 目标变量形状: (2378,)\n",
      "股票 2415 训练完成，MSE损失: 0.269256\n",
      "数据点数量: 2378, 模型保存至: ./../../model\\lightgbm_model_2415.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2422 (252/300)\n",
      "==================================================\n",
      "股票 2415 训练完成，MSE损失: 0.269256\n",
      "数据点数量: 2378, 模型保存至: ./../../model\\lightgbm_model_2415.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2422 (252/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2418, 230), 目标变量形状: (2418,)\n",
      "  特征矩阵形状: (2418, 230), 目标变量形状: (2418,)\n",
      "股票 2422 训练完成，MSE损失: 0.118874\n",
      "数据点数量: 2418, 模型保存至: ./../../model\\lightgbm_model_2422.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2459 (253/300)\n",
      "==================================================\n",
      "股票 2422 训练完成，MSE损失: 0.118874\n",
      "数据点数量: 2418, 模型保存至: ./../../model\\lightgbm_model_2422.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2459 (253/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2350, 230), 目标变量形状: (2350,)\n",
      "  特征矩阵形状: (2350, 230), 目标变量形状: (2350,)\n",
      "股票 2459 训练完成，MSE损失: 0.157740\n",
      "数据点数量: 2350, 模型保存至: ./../../model\\lightgbm_model_2459.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2460 (254/300)\n",
      "==================================================\n",
      "股票 2459 训练完成，MSE损失: 0.157740\n",
      "数据点数量: 2350, 模型保存至: ./../../model\\lightgbm_model_2459.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2460 (254/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "股票 2460 训练完成，MSE损失: 1.220711\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_2460.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2463 (255/300)\n",
      "==================================================\n",
      "股票 2460 训练完成，MSE损失: 1.220711\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_2460.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2463 (255/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 2463 训练完成，MSE损失: 0.108960\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2463.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2466 (256/300)\n",
      "==================================================\n",
      "股票 2463 训练完成，MSE损失: 0.108960\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2463.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2466 (256/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2396, 230), 目标变量形状: (2396,)\n",
      "  特征矩阵形状: (2396, 230), 目标变量形状: (2396,)\n",
      "股票 2466 训练完成，MSE损失: 1.399343\n",
      "数据点数量: 2396, 模型保存至: ./../../model\\lightgbm_model_2466.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2475 (257/300)\n",
      "==================================================\n",
      "股票 2466 训练完成，MSE损失: 1.399343\n",
      "数据点数量: 2396, 模型保存至: ./../../model\\lightgbm_model_2466.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2475 (257/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "股票 2475 训练完成，MSE损失: 0.208019\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_2475.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2493 (258/300)\n",
      "==================================================\n",
      "股票 2475 训练完成，MSE损失: 0.208019\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_2475.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2493 (258/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "  特征矩阵形状: (2422, 230), 目标变量形状: (2422,)\n",
      "股票 2493 训练完成，MSE损失: 0.045728\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2493.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2555 (259/300)\n",
      "==================================================\n",
      "股票 2493 训练完成，MSE损失: 0.045728\n",
      "数据点数量: 2422, 模型保存至: ./../../model\\lightgbm_model_2493.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2555 (259/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2261, 230), 目标变量形状: (2261,)\n",
      "  特征矩阵形状: (2261, 230), 目标变量形状: (2261,)\n",
      "股票 2555 训练完成，MSE损失: 0.195372\n",
      "数据点数量: 2261, 模型保存至: ./../../model\\lightgbm_model_2555.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2594 (260/300)\n",
      "==================================================\n",
      "股票 2555 训练完成，MSE损失: 0.195372\n",
      "数据点数量: 2261, 模型保存至: ./../../model\\lightgbm_model_2555.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2594 (260/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "股票 2594 训练完成，MSE损失: 7.135730\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_2594.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2601 (261/300)\n",
      "==================================================\n",
      "股票 2594 训练完成，MSE损失: 7.135730\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_2594.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2601 (261/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2347, 230), 目标变量形状: (2347,)\n",
      "  特征矩阵形状: (2347, 230), 目标变量形状: (2347,)\n",
      "股票 2601 训练完成，MSE损失: 0.143472\n",
      "数据点数量: 2347, 模型保存至: ./../../model\\lightgbm_model_2601.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2648 (262/300)\n",
      "==================================================\n",
      "股票 2601 训练完成，MSE损失: 0.143472\n",
      "数据点数量: 2347, 模型保存至: ./../../model\\lightgbm_model_2601.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2648 (262/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2402, 230), 目标变量形状: (2402,)\n",
      "  特征矩阵形状: (2402, 230), 目标变量形状: (2402,)\n",
      "股票 2648 训练完成，MSE损失: 0.033208\n",
      "数据点数量: 2402, 模型保存至: ./../../model\\lightgbm_model_2648.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2709 (263/300)\n",
      "==================================================\n",
      "股票 2648 训练完成，MSE损失: 0.033208\n",
      "数据点数量: 2402, 模型保存至: ./../../model\\lightgbm_model_2648.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2709 (263/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2408, 230), 目标变量形状: (2408,)\n",
      "  特征矩阵形状: (2408, 230), 目标变量形状: (2408,)\n",
      "股票 2709 训练完成，MSE损失: 0.265858\n",
      "数据点数量: 2408, 模型保存至: ./../../model\\lightgbm_model_2709.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2714 (264/300)\n",
      "==================================================\n",
      "股票 2709 训练完成，MSE损失: 0.265858\n",
      "数据点数量: 2408, 模型保存至: ./../../model\\lightgbm_model_2709.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2714 (264/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2406, 230), 目标变量形状: (2406,)\n",
      "  特征矩阵形状: (2406, 230), 目标变量形状: (2406,)\n",
      "股票 2714 训练完成，MSE损失: 0.357477\n",
      "数据点数量: 2406, 模型保存至: ./../../model\\lightgbm_model_2714.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2736 (265/300)\n",
      "==================================================\n",
      "股票 2714 训练完成，MSE损失: 0.357477\n",
      "数据点数量: 2406, 模型保存至: ./../../model\\lightgbm_model_2714.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2736 (265/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "  特征矩阵形状: (2405, 230), 目标变量形状: (2405,)\n",
      "股票 2736 训练完成，MSE损失: 0.053620\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_2736.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2812 (266/300)\n",
      "==================================================\n",
      "股票 2736 训练完成，MSE损失: 0.053620\n",
      "数据点数量: 2405, 模型保存至: ./../../model\\lightgbm_model_2736.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2812 (266/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1988, 230), 目标变量形状: (1988,)\n",
      "  特征矩阵形状: (1988, 230), 目标变量形状: (1988,)\n",
      "股票 2812 训练完成，MSE损失: 3.973356\n",
      "数据点数量: 1988, 模型保存至: ./../../model\\lightgbm_model_2812.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2916 (267/300)\n",
      "==================================================\n",
      "股票 2812 训练完成，MSE损失: 3.973356\n",
      "数据点数量: 1988, 模型保存至: ./../../model\\lightgbm_model_2812.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2916 (267/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1770, 230), 目标变量形状: (1770,)\n",
      "  特征矩阵形状: (1770, 230), 目标变量形状: (1770,)\n",
      "股票 2916 训练完成，MSE损失: 2.677500\n",
      "数据点数量: 1770, 模型保存至: ./../../model\\lightgbm_model_2916.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2920 (268/300)\n",
      "==================================================\n",
      "股票 2916 训练完成，MSE损失: 2.677500\n",
      "数据点数量: 1770, 模型保存至: ./../../model\\lightgbm_model_2916.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2920 (268/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1763, 230), 目标变量形状: (1763,)\n",
      "  特征矩阵形状: (1763, 230), 目标变量形状: (1763,)\n",
      "股票 2920 训练完成，MSE损失: 2.768774\n",
      "数据点数量: 1763, 模型保存至: ./../../model\\lightgbm_model_2920.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2938 (269/300)\n",
      "==================================================\n",
      "股票 2920 训练完成，MSE损失: 2.768774\n",
      "数据点数量: 1763, 模型保存至: ./../../model\\lightgbm_model_2920.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 2938 (269/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1584, 230), 目标变量形状: (1584,)\n",
      "  特征矩阵形状: (1584, 230), 目标变量形状: (1584,)\n",
      "股票 2938 训练完成，MSE损失: 0.280506\n",
      "数据点数量: 1584, 模型保存至: ./../../model\\lightgbm_model_2938.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 3816 (270/300)\n",
      "==================================================\n",
      "股票 2938 训练完成，MSE损失: 0.280506\n",
      "数据点数量: 1584, 模型保存至: ./../../model\\lightgbm_model_2938.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 3816 (270/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1358, 230), 目标变量形状: (1358,)\n",
      "  特征矩阵形状: (1358, 230), 目标变量形状: (1358,)\n",
      "股票 3816 训练完成，MSE损失: 0.000793\n",
      "数据点数量: 1358, 模型保存至: ./../../model\\lightgbm_model_3816.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300014 (271/300)\n",
      "==================================================\n",
      "股票 3816 训练完成，MSE损失: 0.000793\n",
      "数据点数量: 1358, 模型保存至: ./../../model\\lightgbm_model_3816.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300014 (271/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2402, 230), 目标变量形状: (2402,)\n",
      "  特征矩阵形状: (2402, 230), 目标变量形状: (2402,)\n",
      "股票 300014 训练完成，MSE损失: 1.154270\n",
      "数据点数量: 2402, 模型保存至: ./../../model\\lightgbm_model_300014.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300015 (272/300)\n",
      "==================================================\n",
      "股票 300014 训练完成，MSE损失: 1.154270\n",
      "数据点数量: 2402, 模型保存至: ./../../model\\lightgbm_model_300014.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300015 (272/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2404, 230), 目标变量形状: (2404,)\n",
      "  特征矩阵形状: (2404, 230), 目标变量形状: (2404,)\n",
      "股票 300015 训练完成，MSE损失: 0.076914\n",
      "数据点数量: 2404, 模型保存至: ./../../model\\lightgbm_model_300015.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300033 (273/300)\n",
      "==================================================\n",
      "股票 300015 训练完成，MSE损失: 0.076914\n",
      "数据点数量: 2404, 模型保存至: ./../../model\\lightgbm_model_300015.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300033 (273/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "  特征矩阵形状: (2421, 230), 目标变量形状: (2421,)\n",
      "股票 300033 训练完成，MSE损失: 7.994403\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_300033.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300059 (274/300)\n",
      "==================================================\n",
      "股票 300033 训练完成，MSE损失: 7.994403\n",
      "数据点数量: 2421, 模型保存至: ./../../model\\lightgbm_model_300033.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300059 (274/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "  特征矩阵形状: (2411, 230), 目标变量形状: (2411,)\n",
      "股票 300059 训练完成，MSE损失: 0.062115\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_300059.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300122 (275/300)\n",
      "==================================================\n",
      "股票 300059 训练完成，MSE损失: 0.062115\n",
      "数据点数量: 2411, 模型保存至: ./../../model\\lightgbm_model_300059.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300122 (275/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2418, 230), 目标变量形状: (2418,)\n",
      "  特征矩阵形状: (2418, 230), 目标变量形状: (2418,)\n",
      "股票 300122 训练完成，MSE损失: 1.087033\n",
      "数据点数量: 2418, 模型保存至: ./../../model\\lightgbm_model_300122.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300124 (276/300)\n",
      "==================================================\n",
      "股票 300122 训练完成，MSE损失: 1.087033\n",
      "数据点数量: 2418, 模型保存至: ./../../model\\lightgbm_model_300122.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300124 (276/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2409, 230), 目标变量形状: (2409,)\n",
      "  特征矩阵形状: (2409, 230), 目标变量形状: (2409,)\n",
      "股票 300124 训练完成，MSE损失: 0.486806\n",
      "数据点数量: 2409, 模型保存至: ./../../model\\lightgbm_model_300124.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300274 (277/300)\n",
      "==================================================\n",
      "股票 300124 训练完成，MSE损失: 0.486806\n",
      "数据点数量: 2409, 模型保存至: ./../../model\\lightgbm_model_300124.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300274 (277/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "股票 300274 训练完成，MSE损失: 1.082660\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_300274.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300308 (278/300)\n",
      "==================================================\n",
      "股票 300274 训练完成，MSE损失: 1.082660\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_300274.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300308 (278/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2278, 230), 目标变量形状: (2278,)\n",
      "  特征矩阵形状: (2278, 230), 目标变量形状: (2278,)\n",
      "股票 300308 训练完成，MSE损失: 1.677437\n",
      "数据点数量: 2278, 模型保存至: ./../../model\\lightgbm_model_300308.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300316 (279/300)\n",
      "==================================================\n",
      "股票 300308 训练完成，MSE损失: 1.677437\n",
      "数据点数量: 2278, 模型保存至: ./../../model\\lightgbm_model_300308.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300316 (279/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2344, 230), 目标变量形状: (2344,)\n",
      "  特征矩阵形状: (2344, 230), 目标变量形状: (2344,)\n",
      "股票 300316 训练完成，MSE损失: 0.394448\n",
      "数据点数量: 2344, 模型保存至: ./../../model\\lightgbm_model_300316.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300347 (280/300)\n",
      "==================================================\n",
      "股票 300316 训练完成，MSE损失: 0.394448\n",
      "数据点数量: 2344, 模型保存至: ./../../model\\lightgbm_model_300316.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300347 (280/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2389, 230), 目标变量形状: (2389,)\n",
      "  特征矩阵形状: (2389, 230), 目标变量形状: (2389,)\n",
      "股票 300347 训练完成，MSE损失: 2.026366\n",
      "数据点数量: 2389, 模型保存至: ./../../model\\lightgbm_model_300347.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300394 (281/300)\n",
      "==================================================\n",
      "股票 300347 训练完成，MSE损失: 2.026366\n",
      "数据点数量: 2389, 模型保存至: ./../../model\\lightgbm_model_300347.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300394 (281/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "  特征矩阵形状: (2410, 230), 目标变量形状: (2410,)\n",
      "股票 300394 训练完成，MSE损失: 0.917931\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_300394.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300408 (282/300)\n",
      "==================================================\n",
      "股票 300394 训练完成，MSE损失: 0.917931\n",
      "数据点数量: 2410, 模型保存至: ./../../model\\lightgbm_model_300394.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300408 (282/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "  特征矩阵形状: (2412, 230), 目标变量形状: (2412,)\n",
      "股票 300408 训练完成，MSE损失: 0.186165\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_300408.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300413 (283/300)\n",
      "==================================================\n",
      "股票 300408 训练完成，MSE损失: 0.186165\n",
      "数据点数量: 2412, 模型保存至: ./../../model\\lightgbm_model_300408.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300413 (283/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2162, 230), 目标变量形状: (2162,)\n",
      "  特征矩阵形状: (2162, 230), 目标变量形状: (2162,)\n",
      "股票 300413 训练完成，MSE损失: 0.551443\n",
      "数据点数量: 2162, 模型保存至: ./../../model\\lightgbm_model_300413.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300418 (284/300)\n",
      "==================================================\n",
      "股票 300413 训练完成，MSE损失: 0.551443\n",
      "数据点数量: 2162, 模型保存至: ./../../model\\lightgbm_model_300413.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300418 (284/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2351, 230), 目标变量形状: (2351,)\n",
      "  特征矩阵形状: (2351, 230), 目标变量形状: (2351,)\n",
      "股票 300418 训练完成，MSE损失: 0.447078\n",
      "数据点数量: 2351, 模型保存至: ./../../model\\lightgbm_model_300418.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300433 (285/300)\n",
      "==================================================\n",
      "股票 300418 训练完成，MSE损失: 0.447078\n",
      "数据点数量: 2351, 模型保存至: ./../../model\\lightgbm_model_300418.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300433 (285/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2397, 230), 目标变量形状: (2397,)\n",
      "  特征矩阵形状: (2397, 230), 目标变量形状: (2397,)\n",
      "股票 300433 训练完成，MSE损失: 0.136471\n",
      "数据点数量: 2397, 模型保存至: ./../../model\\lightgbm_model_300433.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300442 (286/300)\n",
      "==================================================\n",
      "股票 300433 训练完成，MSE损失: 0.136471\n",
      "数据点数量: 2397, 模型保存至: ./../../model\\lightgbm_model_300433.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300442 (286/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2408, 230), 目标变量形状: (2408,)\n",
      "  特征矩阵形状: (2408, 230), 目标变量形状: (2408,)\n",
      "股票 300442 训练完成，MSE损失: 0.487900\n",
      "数据点数量: 2408, 模型保存至: ./../../model\\lightgbm_model_300442.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300450 (287/300)\n",
      "==================================================\n",
      "股票 300442 训练完成，MSE损失: 0.487900\n",
      "数据点数量: 2408, 模型保存至: ./../../model\\lightgbm_model_300442.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300450 (287/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2254, 230), 目标变量形状: (2254,)\n",
      "  特征矩阵形状: (2254, 230), 目标变量形状: (2254,)\n",
      "股票 300450 训练完成，MSE损失: 0.395069\n",
      "数据点数量: 2254, 模型保存至: ./../../model\\lightgbm_model_300450.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300498 (288/300)\n",
      "==================================================\n",
      "股票 300450 训练完成，MSE损失: 0.395069\n",
      "数据点数量: 2254, 模型保存至: ./../../model\\lightgbm_model_300450.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300498 (288/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2280, 230), 目标变量形状: (2280,)\n",
      "  特征矩阵形状: (2280, 230), 目标变量形状: (2280,)\n",
      "股票 300498 训练完成，MSE损失: 0.090210\n",
      "数据点数量: 2280, 模型保存至: ./../../model\\lightgbm_model_300498.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300502 (289/300)\n",
      "==================================================\n",
      "股票 300498 训练完成，MSE损失: 0.090210\n",
      "数据点数量: 2280, 模型保存至: ./../../model\\lightgbm_model_300498.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300502 (289/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (2207, 230), 目标变量形状: (2207,)\n",
      "  特征矩阵形状: (2207, 230), 目标变量形状: (2207,)\n",
      "股票 300502 训练完成，MSE损失: 1.100264\n",
      "数据点数量: 2207, 模型保存至: ./../../model\\lightgbm_model_300502.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300628 (290/300)\n",
      "==================================================\n",
      "股票 300502 训练完成，MSE损失: 1.100264\n",
      "数据点数量: 2207, 模型保存至: ./../../model\\lightgbm_model_300502.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300628 (290/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1955, 230), 目标变量形状: (1955,)\n",
      "  特征矩阵形状: (1955, 230), 目标变量形状: (1955,)\n",
      "股票 300628 训练完成，MSE损失: 0.326750\n",
      "数据点数量: 1955, 模型保存至: ./../../model\\lightgbm_model_300628.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300661 (291/300)\n",
      "==================================================\n",
      "股票 300628 训练完成，MSE损失: 0.326750\n",
      "数据点数量: 1955, 模型保存至: ./../../model\\lightgbm_model_300628.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300661 (291/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1893, 230), 目标变量形状: (1893,)\n",
      "  特征矩阵形状: (1893, 230), 目标变量形状: (1893,)\n",
      "股票 300661 训练完成，MSE损失: 2.939843\n",
      "数据点数量: 1893, 模型保存至: ./../../model\\lightgbm_model_300661.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300750 (292/300)\n",
      "==================================================\n",
      "股票 300661 训练完成，MSE损失: 2.939843\n",
      "数据点数量: 1893, 模型保存至: ./../../model\\lightgbm_model_300661.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300750 (292/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1654, 230), 目标变量形状: (1654,)\n",
      "  特征矩阵形状: (1654, 230), 目标变量形状: (1654,)\n",
      "股票 300750 训练完成，MSE损失: 8.334762\n",
      "数据点数量: 1654, 模型保存至: ./../../model\\lightgbm_model_300750.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300759 (293/300)\n",
      "==================================================\n",
      "股票 300750 训练完成，MSE损失: 8.334762\n",
      "数据点数量: 1654, 模型保存至: ./../../model\\lightgbm_model_300750.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300759 (293/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1498, 230), 目标变量形状: (1498,)\n",
      "  特征矩阵形状: (1498, 230), 目标变量形状: (1498,)\n",
      "股票 300759 训练完成，MSE损失: 0.630050\n",
      "数据点数量: 1498, 模型保存至: ./../../model\\lightgbm_model_300759.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300760 (294/300)\n",
      "==================================================\n",
      "股票 300759 训练完成，MSE损失: 0.630050\n",
      "数据点数量: 1498, 模型保存至: ./../../model\\lightgbm_model_300759.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300760 (294/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1570, 230), 目标变量形状: (1570,)\n",
      "  特征矩阵形状: (1570, 230), 目标变量形状: (1570,)\n",
      "股票 300760 训练完成，MSE损失: 14.221586\n",
      "数据点数量: 1570, 模型保存至: ./../../model\\lightgbm_model_300760.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300782 (295/300)\n",
      "==================================================\n",
      "股票 300760 训练完成，MSE损失: 14.221586\n",
      "数据点数量: 1570, 模型保存至: ./../../model\\lightgbm_model_300760.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300782 (295/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1407, 230), 目标变量形状: (1407,)\n",
      "  特征矩阵形状: (1407, 230), 目标变量形状: (1407,)\n",
      "股票 300782 训练完成，MSE损失: 6.967957\n",
      "数据点数量: 1407, 模型保存至: ./../../model\\lightgbm_model_300782.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300832 (296/300)\n",
      "==================================================\n",
      "股票 300782 训练完成，MSE损失: 6.967957\n",
      "数据点数量: 1407, 模型保存至: ./../../model\\lightgbm_model_300782.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300832 (296/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1189, 230), 目标变量形状: (1189,)\n",
      "  特征矩阵形状: (1189, 230), 目标变量形状: (1189,)\n",
      "股票 300832 训练完成，MSE损失: 0.914623\n",
      "数据点数量: 1189, 模型保存至: ./../../model\\lightgbm_model_300832.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300896 (297/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1092, 230), 目标变量形状: (1092,)\n",
      "股票 300832 训练完成，MSE损失: 0.914623\n",
      "数据点数量: 1189, 模型保存至: ./../../model\\lightgbm_model_300832.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300896 (297/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1092, 230), 目标变量形状: (1092,)\n",
      "股票 300896 训练完成，MSE损失: 33.246261\n",
      "数据点数量: 1092, 模型保存至: ./../../model\\lightgbm_model_300896.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300979 (298/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (955, 230), 目标变量形状: (955,)\n",
      "股票 300896 训练完成，MSE损失: 33.246261\n",
      "数据点数量: 1092, 模型保存至: ./../../model\\lightgbm_model_300896.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300979 (298/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (955, 230), 目标变量形状: (955,)\n",
      "股票 300979 训练完成，MSE损失: 0.800274\n",
      "数据点数量: 955, 模型保存至: ./../../model\\lightgbm_model_300979.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300999 (299/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1085, 230), 目标变量形状: (1085,)\n",
      "股票 300979 训练完成，MSE损失: 0.800274\n",
      "数据点数量: 955, 模型保存至: ./../../model\\lightgbm_model_300979.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 300999 (299/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (1085, 230), 目标变量形状: (1085,)\n",
      "股票 300999 训练完成，MSE损失: 1.321054\n",
      "数据点数量: 1085, 模型保存至: ./../../model\\lightgbm_model_300999.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 301269 (300/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (639, 230), 目标变量形状: (639,)\n",
      "股票 300999 训练完成，MSE损失: 1.321054\n",
      "数据点数量: 1085, 模型保存至: ./../../model\\lightgbm_model_300999.txt\n",
      "\n",
      "==================================================\n",
      "训练股票 301269 (300/300)\n",
      "==================================================\n",
      "  特征矩阵形状: (639, 230), 目标变量形状: (639,)\n",
      "股票 301269 训练完成，MSE损失: 3.032431\n",
      "数据点数量: 639, 模型保存至: ./../../model\\lightgbm_model_301269.txt\n",
      "\n",
      "============================================================\n",
      "所有股票训练完成！\n",
      "成功训练的股票数量: 300\n",
      "所有股票模型的MSE总和: 656.375317\n",
      "简单平均MSE: 2.187918\n",
      "总数据点数量: 632729\n",
      "按数据点数量加权平均的总体MSE: 2.044430\n",
      "============================================================\n",
      "股票 301269 训练完成，MSE损失: 3.032431\n",
      "数据点数量: 639, 模型保存至: ./../../model\\lightgbm_model_301269.txt\n",
      "\n",
      "============================================================\n",
      "所有股票训练完成！\n",
      "成功训练的股票数量: 300\n",
      "所有股票模型的MSE总和: 656.375317\n",
      "简单平均MSE: 2.187918\n",
      "总数据点数量: 632729\n",
      "按数据点数量加权平均的总体MSE: 2.044430\n",
      "============================================================\n"
     ]
    }
   ],
   "source": [
    "# 获取特征列\n",
    "features = df.columns.difference([\"Date\", \"StockCode\"]).tolist()\n",
    "\n",
    "# 获取所有股票代码\n",
    "unique_stock_codes = df[\"StockCode\"].unique()\n",
    "print(f\"总共有 {len(unique_stock_codes)} 支股票需要训练\")\n",
    "\n",
    "# 存储每个股票的模型和结果\n",
    "stock_models = {}\n",
    "stock_scalers = {}\n",
    "stock_losses = {}\n",
    "stock_data_points = {}  # 存储每个股票的数据点数量\n",
    "total_mse_loss = 0.0\n",
    "total_weighted_mse = 0.0  # 加权MSE总和\n",
    "total_data_points = 0  # 总数据点数量\n",
    "\n",
    "# 创建目录\n",
    "os.makedirs(MODEL_DIR, exist_ok=True)\n",
    "os.makedirs(OUTPUT_DIR, exist_ok=True)\n",
    "\n",
    "# 训练每个股票的LightGBM模型\n",
    "for i, stock_code in enumerate(unique_stock_codes):\n",
    "    print(f\"\\n{'='*50}\")\n",
    "    print(f\"训练股票 {stock_code} ({i+1}/{len(unique_stock_codes)})\")\n",
    "    print(f\"{'='*50}\")\n",
    "\n",
    "    # 获取该股票的数据\n",
    "    stock_data = df[df[\"StockCode\"] == stock_code].copy()\n",
    "    stock_data = stock_data.sort_values(\"Date\").reset_index(drop=True)\n",
    "\n",
    "    # 特征标准化（保留收盘价原始值）\n",
    "    scaler = StandardScaler()\n",
    "    backup_close = stock_data[\"Close\"].copy()\n",
    "    stock_data[features] = scaler.fit_transform(stock_data[features])\n",
    "    stock_data[\"Close\"] = backup_close\n",
    "\n",
    "    # 保存标准化器\n",
    "    stock_scalers[stock_code] = scaler\n",
    "\n",
    "    # 创建LightGBM特征\n",
    "    X, y = create_lgb_features(stock_data, seq_len, features)\n",
    "\n",
    "    print(f\"特征矩阵形状: {X.shape}, 目标变量形状: {y.shape}\")\n",
    "\n",
    "    # 创建LightGBM数据集\n",
    "    train_data = lgb.Dataset(X, label=y)\n",
    "\n",
    "    # 训练LightGBM模型\n",
    "    model = lgb.train(\n",
    "        lgb_params,\n",
    "        train_data,\n",
    "        valid_sets=[train_data],\n",
    "        callbacks=[lgb.early_stopping(stopping_rounds=10), lgb.log_evaluation(0)],\n",
    "    )\n",
    "\n",
    "    # 预测并计算MSE\n",
    "    y_pred = model.predict(X)\n",
    "    mse_loss = mean_squared_error(y, y_pred)\n",
    "\n",
    "    # 记录该股票的损失和数据点数量\n",
    "    stock_losses[stock_code] = mse_loss\n",
    "    stock_data_points[stock_code] = len(X)  # 记录数据点数量\n",
    "    total_mse_loss += mse_loss\n",
    "    total_weighted_mse += mse_loss * len(X)  # 加权累加\n",
    "    total_data_points += len(X)  # 累加数据点数量\n",
    "\n",
    "    # 保存模型\n",
    "    model_path = os.path.join(MODEL_DIR, f\"lightgbm_model_{stock_code}.txt\")\n",
    "    model.save_model(model_path)\n",
    "    stock_models[stock_code] = model_path\n",
    "\n",
    "    print(f\"股票 {stock_code} 训练完成，MSE损失: {mse_loss:.6f}\")\n",
    "    print(f\"数据点数量: {len(X)}, 模型保存至: {model_path}\")\n",
    "\n",
    "print(f\"\\n{'='*60}\")\n",
    "print(f\"所有股票训练完成！\")\n",
    "print(f\"成功训练的股票数量: {len(stock_models)}\")\n",
    "print(f\"所有股票模型的MSE总和: {total_mse_loss:.6f}\")\n",
    "print(f\"简单平均MSE: {total_mse_loss/len(stock_models):.6f}\")\n",
    "print(f\"总数据点数量: {total_data_points}\")\n",
    "# 计算按数据点数量加权平均的总体MSE\n",
    "weighted_average_mse = (\n",
    "    total_weighted_mse / total_data_points if total_data_points > 0 else 0\n",
    ")\n",
    "print(f\"按数据点数量加权平均的总体MSE: {weighted_average_mse:.6f}\")\n",
    "print(f\"{'='*60}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a80696d9",
   "metadata": {},
   "source": [
    "## 使用训练好的LightGBM模型进行预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "fc8bdfe2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始使用训练好的LightGBM模型进行预测...\n",
      "当前特征列表长度: 23\n",
      "特征列表: ['Amplitude', 'CCI.CCI', 'Close', 'High', 'KDJ.D', 'KDJ.J', 'KDJ.K', 'Low', 'MA.MA1', 'MA.MA2', 'MA.MA3', 'MA.MA4', 'MA.MA5', 'MA.MA6', 'MACD.DEA', 'MACD.DIFF', 'MACD.MACD', 'Open', 'PriceChange', 'PriceChangePercentage', 'Turnover', 'TurnoverRate', 'Volume']\n",
      "\n",
      "处理股票: 600000\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 10.7549\n",
      "\n",
      "处理股票: 600009\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 32.9043\n",
      "\n",
      "处理股票: 600010\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 1.7638\n",
      "\n",
      "处理股票: 600011\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 7.0523\n",
      "\n",
      "处理股票: 600015\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 7.8113\n",
      "\n",
      "处理股票: 600016\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 4.0335\n",
      "\n",
      "处理股票: 600018\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 5.4883\n",
      "\n",
      "处理股票: 600019\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 6.7030\n",
      "\n",
      "处理股票: 600023\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 5.6137\n",
      "\n",
      "处理股票: 600025\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 9.2687\n",
      "\n",
      "处理股票: 600026\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 10.3329\n",
      "\n",
      "处理股票: 600027\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 5.6356\n",
      "\n",
      "处理股票: 600028\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 5.7057\n",
      "\n",
      "处理股票: 600029\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 5.7923\n",
      "\n",
      "处理股票: 600030\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 25.2792\n",
      "\n",
      "处理股票: 600031\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 19.1423\n",
      "\n",
      "处理股票: 600036\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 42.5580\n",
      "\n",
      "处理股票: 600039\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 8.8410\n",
      "\n",
      "处理股票: 600048\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 9.4402\n",
      "\n",
      "处理股票: 600050\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 5.4691\n",
      "\n",
      "处理股票: 600061\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 6.8125\n",
      "\n",
      "处理股票: 600066\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 25.7816\n",
      "\n",
      "处理股票: 600085\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 36.0020\n",
      "\n",
      "处理股票: 600089\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 11.8778\n",
      "\n",
      "处理股票: 600104\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 15.3279\n",
      "\n",
      "处理股票: 600111\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 23.4402\n",
      "\n",
      "处理股票: 600115\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 3.8191\n",
      "\n",
      "处理股票: 600150\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 28.8828\n",
      "\n",
      "处理股票: 600160\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 24.0152\n",
      "\n",
      "处理股票: 600161\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 20.7722\n",
      "\n",
      "处理股票: 600176\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 11.7822\n",
      "\n",
      "处理股票: 600183\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 22.8913\n",
      "\n",
      "处理股票: 600188\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 12.7081\n",
      "\n",
      "处理股票: 600196\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 23.9762\n",
      "\n",
      "处理股票: 600219\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 3.3977\n",
      "\n",
      "处理股票: 600233\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 13.1364\n",
      "\n",
      "处理股票: 600276\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 47.5740\n",
      "\n",
      "处理股票: 600309\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 56.5679\n",
      "\n",
      "处理股票: 600332\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 26.8711\n",
      "\n",
      "处理股票: 600346\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 15.2112\n",
      "\n",
      "处理股票: 600362\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 21.1645\n",
      "\n",
      "处理股票: 600372\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 11.0648\n",
      "\n",
      "处理股票: 600377\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 15.2517\n",
      "\n",
      "处理股票: 600406\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 23.2470\n",
      "\n",
      "处理股票: 600415\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 14.3044\n",
      "\n",
      "处理股票: 600426\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 20.8768\n",
      "\n",
      "处理股票: 600436\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 205.1920\n",
      "\n",
      "处理股票: 600438\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 17.3299\n",
      "\n",
      "处理股票: 600460\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 24.6624\n",
      "\n",
      "处理股票: 600482\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 20.5003\n",
      "\n",
      "处理股票: 600489\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 14.2864\n",
      "\n",
      "处理股票: 600515\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 230\n",
      "  预测完成，预测值: 3.6212\n",
      "\n",
      "处理股票: 600519\n",
      "  原始数据形状: (10, 25)\n",
      "  可用特征列数: 23\n",
      "  窗口数据形状: (10, 23)\n",
      "  展平后特征数量: (230,)\n",
      "  最终特征矩阵形状: (1, 230)\n",
      "  模型期望特征数量: 220\n",
      " 警告：特征数量不匹配！预测特征: (1, 230), 模型期望: 220\n",
      "\n",
      "完成 52 支股票的预测\n",
      "\n",
      "涨幅最大的前10支股票: [np.int64(600026), np.int64(600309), np.int64(600039), np.int64(600048), np.int64(600089), np.int64(600332), np.int64(600460), np.int64(600438), np.int64(600009), np.int64(600372)]\n",
      "涨幅最小的后10支股票: [np.int64(600219), np.int64(600011), np.int64(600276), np.int64(600489), np.int64(600436), np.int64(600019), np.int64(600066), np.int64(600377), np.int64(600015), np.int64(600415)]\n",
      "\n",
      "预测结果已保存到: ./../../output\\results_lightgbm.csv\n",
      "损失汇总已保存到: ./../../output\\lightgbm_stock_losses_summary.csv\n",
      "\n",
      "最终总结:\n",
      "- 成功训练股票数: 300\n",
      "- 所有股票LightGBM模型MSE总和: 656.375317\n",
      "- 简单平均MSE: 2.187918\n",
      "- 按数据点数量加权平均的总体MSE: 2.044430\n",
      "- 总数据点数量: 632729\n",
      "0\n"
     ]
    }
   ],
   "source": [
    "# 在测试集上进行预测\n",
    "all_preds = []\n",
    "max_date = df[\"Date\"].max()\n",
    "\n",
    "print(\"开始使用训练好的LightGBM模型进行预测...\")\n",
    "print(f\"当前特征列表长度: {len(features)}\")\n",
    "print(f\"特征列表: {features}\")\n",
    "a = 0\n",
    "for stock_code in stock_models.keys():\n",
    "    print(f\"\\n处理股票: {stock_code}\")\n",
    "\n",
    "    # 加载该股票的模型和标准化器\n",
    "    model_path = stock_models[stock_code]\n",
    "    scaler = stock_scalers[stock_code]\n",
    "\n",
    "    # 加载LightGBM模型\n",
    "    model = lgb.Booster(model_file=model_path)\n",
    "\n",
    "    # 获取该股票的最新数据用于预测\n",
    "    stock_data = df[df[\"StockCode\"] == stock_code].sort_values(\"Date\")\n",
    "\n",
    "    # 获取最后seq_len条记录\n",
    "    last_records = stock_data.iloc[-seq_len:].copy().reset_index(drop=True)\n",
    "    print(f\"  原始数据形状: {last_records.shape}\")\n",
    "    print(f\"  可用特征列数: {len(features)}\")\n",
    "\n",
    "    # 标准化特征（保留收盘价）\n",
    "    backup_close = last_records[\"Close\"].copy()\n",
    "    last_records[features] = scaler.transform(last_records[features])\n",
    "    last_records[\"Close\"] = backup_close\n",
    "\n",
    "    # 提取特征并展平 - 确保与训练时的特征维度一致\n",
    "    window_data = last_records[features].values\n",
    "    print(f\"  窗口数据形状: {window_data.shape}\")\n",
    "    print(f\"  展平后特征数量: {window_data.flatten().shape}\")\n",
    "\n",
    "    X = window_data.flatten().reshape(1, -1)\n",
    "    print(f\"  最终特征矩阵形状: {X.shape}\")\n",
    "    print(f\"  模型期望特征数量: {model.num_feature()}\")\n",
    "\n",
    "    # 检查特征数量是否匹配\n",
    "    if X.shape[1] != model.num_feature():\n",
    "        print(\n",
    "            f\" 警告：特征数量不匹配！预测特征: {X.shape}, 模型期望: {model.num_feature()}\"\n",
    "        )\n",
    "        break\n",
    "\n",
    "    # 进行预测\n",
    "    pred_value = model.predict(X)[0]\n",
    "\n",
    "    # 保存预测结果\n",
    "    all_preds.append((stock_code, pred_value))\n",
    "    print(f\"  预测完成，预测值: {pred_value:.4f}\")\n",
    "\n",
    "print(f\"\\n完成 {len(all_preds)} 支股票的预测\")\n",
    "\n",
    "# 如果没有成功预测，停止执行后续代码\n",
    "if len(all_preds) == 0:\n",
    "    print(\"没有成功预测任何股票，请检查特征匹配问题\")\n",
    "else:\n",
    "    # 计算涨跌幅并排序\n",
    "    pricechangerate = []\n",
    "    for i in range(len(all_preds)):\n",
    "        stockcode, pred = all_preds[i]\n",
    "\n",
    "        # 获取该股票当前的收盘价\n",
    "        preClose = df[(df[\"StockCode\"] == stockcode) & (df[\"Date\"] == max_date)][\n",
    "            \"Close\"\n",
    "        ].values[0]\n",
    "\n",
    "        # 计算预测涨跌幅 = (预测价格 - 当前价格) / 当前价格 * 100%\n",
    "        pricechangerate.append((stockcode, (pred - preClose) / preClose * 100))\n",
    "\n",
    "    # 按涨跌幅排序（降序）\n",
    "    pricechangerate = sorted(pricechangerate, key=lambda x: x[1], reverse=True)\n",
    "\n",
    "    # 获取涨幅最大的前10支股票和涨幅最小的后10支股票\n",
    "    pred_top_10_max_target = [x[0] for x in pricechangerate[:10]]  # 涨幅最大的10支\n",
    "    pred_top_10_min_target = [x[0] for x in pricechangerate[-10:]]  # 涨幅最小的10支\n",
    "\n",
    "    print(f\"\\n涨幅最大的前10支股票: {pred_top_10_max_target}\")\n",
    "    print(f\"涨幅最小的后10支股票: {pred_top_10_min_target}\")\n",
    "\n",
    "    # 构建结果数据\n",
    "    data = {\n",
    "        \"涨幅最大股票代码\": pred_top_10_max_target,\n",
    "        \"涨幅最小股票代码\": pred_top_10_min_target,\n",
    "    }\n",
    "\n",
    "    # 输出预测结果到CSV文件\n",
    "    RESULT_PATH = os.path.join(OUTPUT_DIR, \"results_lightgbm.csv\")\n",
    "    result_df = pd.DataFrame(data)\n",
    "    result_df.to_csv(RESULT_PATH, index=False)\n",
    "    print(f\"\\n预测结果已保存到: {RESULT_PATH}\")\n",
    "\n",
    "    # 保存损失汇总\n",
    "    loss_summary = {\n",
    "        \"股票代码\": list(stock_losses.keys()),\n",
    "        \"MSE损失\": list(stock_losses.values()),\n",
    "        \"数据点数量\": [stock_data_points[code] for code in stock_losses.keys()],\n",
    "        \"加权MSE贡献\": [\n",
    "            stock_losses[code] * stock_data_points[code] for code in stock_losses.keys()\n",
    "        ],\n",
    "    }\n",
    "    loss_df = pd.DataFrame(loss_summary)\n",
    "    loss_df[\"总MSE损失\"] = total_mse_loss\n",
    "    loss_df[\"总数据点数量\"] = total_data_points\n",
    "    loss_df[\"加权平均MSE\"] = weighted_average_mse\n",
    "    LOSS_PATH = os.path.join(OUTPUT_DIR, \"lightgbm_stock_losses_summary.csv\")\n",
    "    loss_df.to_csv(LOSS_PATH, index=False)\n",
    "    print(f\"损失汇总已保存到: {LOSS_PATH}\")\n",
    "\n",
    "    print(f\"\\n最终总结:\")\n",
    "    print(f\"- 成功训练股票数: {len(stock_models)}\")\n",
    "    print(f\"- 所有股票LightGBM模型MSE总和: {total_mse_loss:.6f}\")\n",
    "    print(f\"- 简单平均MSE: {total_mse_loss/len(stock_models):.6f}\")\n",
    "    print(f\"- 按数据点数量加权平均的总体MSE: {weighted_average_mse:.6f}\")\n",
    "    print(f\"- 总数据点数量: {total_data_points}\")\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f32beb03",
   "metadata": {},
   "source": [
    "## 结果分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "812d0da7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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c+fOkqRly5YpPz9fn376qXbu3KnHH39cv/nNb3T55ZfL6XSqpKTErZFdUlJS64mgS2ZmpoYOHWrmwXU/uxqlUs3oJYfDoZCQENlstlrnKC4u1l/+8hfdfvvtOuecc8z1Y8eO1YIFCzRq1Ch9+umntfI5ffr0Wve9y8lKQI53PQAA36L95DnaT7843dtPR44cUWlpqdlJe+jQIVksFj355JOqqqrS9u3b3b7n4MGDmjBhgsrLy9W9e3eNHz9ekswcf/TRR6qsrJTVaq2zsw3wBzqlgFNgGIZGjx6tXr166e2339bZZ5+td955R6NGjdKhQ4d011136bbbbjOHlR/N9Y//hg0btGvXLu3cudNc969//UsXXHCB277Z2dnauXOnWrZsqdjYWEk1T2euu+46/fOf/5RU86Tn+eef1+DBgzVt2jR99tlnWrVqlaRfnoidivbt25/ScfX19ddf65lnnqmzUTV79my1a9dOL7zwgqxWq84//3y1a9dOL7/8svkDtmXLljr//PMlSeeff76+++47vfjii8dtVLmeTrm88MIL+vLLL7Vp0ya1aNFCd999t+6//36tX7/ebLR269bN3P/iiy+WJO3du1ctW7ZUQUGB5syZo5CQEH322Wfat2+fZsyYoR9//FFSzVPZM844w2x4nIirwXfsqJ6SkhL94x//0D//+U/zftq9e7cmT56sBQsWmI2ZuLg4MxfH2r59u3JycrR3716VlJRo48aNZoPL4XBoyJAhtY5p27ZtrXU7duzQ66+/roqKilr3VF0NyvXr19cZ0x//+EfZ7XY9+eSTbuuDgoL08ssv66KLLtKIESO0bNkyt/M+//zzmj9/voKCgmS1WpWZmalx48YpNzdXrVu31t/+9jeNHz9e0dHRdeYBAOBftJ8aB+2nX5zu7afly5e7dXC2adNG1113nXr37q3S0tI6H/65RrBFRETU+h6LxaKHHnpI8+bNq/OaXZYsWeK3ObzQ/NApBZyCxx57TJ999pmys7MVHh6uZ599VnfeeacSEhI0ceJEderU6bj/2LvebvHnP/9ZLVq00P79+9W/f389+uijWrlypT799FNz36uuukovvviiXnrpJS1atMh8mud0OlVZWWk+nXE6nSotLdXhw4dVXl6uqqoqc1tFRcVxn0AFspUrV+rKK680GyTh4eHq2rWrcnNzj3uMxWJxq82/8MILtX79eu3cuVOGYchut7s1PJ566ilJNU9FL7nkEmVmZkqS/ve//+n22293a5xJNQ2c8PBws4TA4XDom2++UXBwsLZs2aJWrVrp66+/1oEDByTVNJTat2+vpKQkczLWulx00UVmYyonJ0cXXHCBOeHkoUOHZBiGOWGoJN1222268MIL6z3659FHH5UkPfnkk1q1apWWL18uqeZp9bZt2457XFFRkflUVarpTDr//PPd5iv4/PPPdcMNN2j37t3muurqapWXl6tDhw61zvnOO+9owYIFeuWVV9SuXbta2/v06aM333xT1113nQYMGKBly5apY8eOkuQ2JL6goEBpaWmaMmWKunTpoi1btmj69Om688476ZQCgABF+8n7aD+dXu2n66+/Xr/73e/0xRdfaMCAAebcXa420RtvvGGWMEo1nVYzZsyoFZPVajVHnj3xxBOaOnWqgoKCtGbNGvXq1UtnnHGGZs6cqXnz5pnzfAG+QqcUcAruv/9+XXrppUpISJAk3XDDDXrnnXd0ySWXqGfPnlq7du1xGzKuH64ffvihEhISNG3aNOXm5uqWW25Rly5d9Otf/9rc94UXXtDcuXNVVVXldj6Hw6F33nlHUVFR5rqbb77Z7XuO3nbTTTed0nVOmzbNnPTwWG+99ZYeeeQRHTx4UNdff72OHDmid999Vzt37jT3ycrK0v33368tW7aob9++eu2119S5c2fdfvvtevnll839XE+NHnvsMU2bNk0VFRXavn27+TTK5d///nedtfKGYejrr7/WokWLNHjwYHN9aGiounTpYj5F69y5c60JIrOzs7Vjxw517dpVL730ku644w5ZrVYtWbJEH3zwQa3vkX4Zct2xY0e99957MgxDnTt31sSJE3X33Xfrs88+08cff2w+iX3qqadOOJFl7969zYbKN998o+TkZLNRFR8fr+TkZKWlpcnhcOjuu+9WTEyMfvOb3xz3fCdjGIYKCws1ceJEvfrqq8fd7y9/+Yv+9Kc/Sap5Uvf2229r/fr1tTqTWrVqVWcH07G++OILjRw5Ur/73e+UnJysLVu21PkUOikpSQsWLNDEiRPVs2dPzZ07V6NGjTK3V1ZW6oYbblD79u116623ateuXWZDtqCgwO2crVq1cvt/AQDgP7SfaD9JtJ9c6tN+OnaeKJvNJpvNpoqKiuPOH2UYhjnpvGsklWEY5v8Lrnvc4XBoxowZ2rVrl1q3bq1u3brpq6++Uo8ePU6SCaBxMdE5cAri4uJ0+eWXS5K2bdumsWPH6h//+IeuueYaff/99xoxYoRWrlypqqqqWsce74lPUVGRXnnlFV1zzTUaPHiw+fnd736nzz//3G0I8zPPPKNdu3bp4MGDKiwsPO7n4MGD2rVrlxYuXNio15+fn68RI0bovvvu0xtvvKFVq1bJMAx98MEHCgsLkyTt3LlT1113ne688069+eab+umnn/Twww9LqmmsrV+/Xo899pjOPPNMrV+/XuvXr9fYsWMl1TzdcjqdbsOOpZoncvHx8eZyTk6OOVHneeedp3bt2unFF190O6Z379765ptvlJOTU+d8Bi+99JL5Q33ChAlat26dnE6nRo0apa1bt7p9XE+ijv07fOWVV7R7925dffXVkn55mut69fTtt99uTppZXV1dazh6r169dOjQIe3evbtWnBaLRcuXL9c555yjBx98UJ07d9ZLL71U6zqeffZZt0k665pos6ioSFu3blW3bt302muvqWXLlho5cqQMw6j16devn9s5rrzySn355Zc699xz3c5ZWFhYa94Pqabxc+TIETMH5eXluu2223TBBRdoyJAh6tu3r3r06KHu3bvX+Xn99de1YcMGnXfeeeabd1z5Gz16tNauXatvvvlGCQkJio+PV//+/SVJ/fr1U3x8vPk5dp4IAID/0H6i/XQ02k8nbz8dKy8vT0uXLtWIESNks9lqzV22fft2882Rq1evNteXl5crLCxM1dXVqqiokFRT5rd27VpdfPHF2rNnj5555hk6pOAXdEoBp+DgwYNasmSJrrzySvXo0UN2u11fffWVVqxYodzcXLVp00bXXnutoqOjNWDAAE2cOFEffvihpF9+4P7444/atm2bDh06JEmKiIjQjz/+qMLCQp1//vk6//zzFRQUpPfff19JSUlu3798+XIlJSWpS5cuJ/0kJSVp2bJljXr9GzduVGRkpCZMmKCBAwfqxhtv1IEDB3TRRReZNfr5+fl6/vnnde+992rQoEEaP368+cQtISFB559/vhISEhQcHGxer2sOBtcPYlfj4+abbzYbC0fXt3fr1k3Z2dlav369nn/+eX3//fdKS0tzi7V3797KycnRN998U6tRtW/fPmVmZurKK69U+/bt9fDDD+vFF1+Uw+HQCy+8oMjISLePq4zM9dTO6XTqhRde0N13361x48apU6dOkmqePEkyf+i3bdtW3bp101/+8hdlZmbWGrkTHh6us846S+vWrdMPP/xQK86EhAR9+eWXeuuttxQdHa0777zTnEzUZcSIEcrOzjY/rieFkjRlyhQlJCTo6aefltVq1YwZM3Tvvfe6jShavny5OnTooB9++MFcd3Tj79prr1W/fv1qvaFmzJgx2rt3b52v0g4LCzMnUg0NDdWaNWu0fPly3XrrrXI4HCotLZXFYtEbb7zh1qC7/PLLFR8fr4SEBK1evVpnn322JKm0tFQ33nij3n77bY0YMUJ9+vRRZWWlKisrtXXrVknSrl27zHU33nijWSoAAPA/2k+0nyTaTw1pPzmdTn3zzTd68803VV1drf79+2vPnj166qmn9N133+m5555zu56zzjpL27dv19atW5WammquLygoULt27fSf//xHISEh5veFhYXpH//4h0pLS9W1a1e3WK699loBvkD5HtAABw4c0FVXXaXs7GwlJCTo4osv1qpVq8wfpjt27FCLFi00depUjR8/XqtWrVJOTo5effVVcwi4680gR7/y97rrrtM555yje+65R2+++ab5yt3Ro0fr8ssv11lnnWXuW1ZWphEjRri9VvdkDMNQeXm52xs+PHH22Wfr4MGDWrdunbp37661a9fqoosuctvnzDPP1O9//3tzOTY29rhPfY7lenJUWloqqWb49qRJkzR16lS3/Vq2bKm+fftKqpmos6qqShMmTNDkyZPNfXr37q3XX39dhmHopptu0tq1ayXV5GTMmDG64oorFBMTYx4bFBSk4OBgzZ8/X5LM11U///zzdcb68ccf69JLL9XTTz9trjv33HP1xBNP6PHHHzfnXZBqJviMiIjQlClTap2nd+/eWrp0qVq3bm2WNRzNYrHo97//vYYMGaLRo0frmWee0ciRI805HmJjY81cHKusrEzXX3+97Ha7vvvuO1133XW19iktLdXBgwfd7rWjvfTSS+Ybco5ujLlen/273/3OzJlU04gqLy9XTEyMue7MM890O2dubq4Mw6jViNy9e7cuueQSt3XV1dW64oortHnzZr377rvavHmzNm/ebD6ldQ1PP/rVyBaL5bhD2wEAvkP7qQbtp1/Qfqpf+2nmzJl67LHHdMEFF8hms2nPnj1uJalHzycl1ZT7HVu+KdV05iYmJmrAgAEqLS1VaGio2Xn22muvacqUKdqxY4ekmjcynnPOOUx0Dp+htQ40QExMjB555BElJSXpvPPOk81mc6vtP9aZZ56pPXv2yOl0mv/wHzp0SEFBQSovL5fNZjPnRJBqGlHTp0/Xp59+qrPPPltvvfVWrVcRR0REmE8LG+q///3vKR13rPbt26tjx47q37+/nE6nLrzwwloNhWOfTjZEVFSUoqOjzdfcnnXWWTrrrLNO2ijs2rWrDMPQrl27zHW9e/fWt99+a/7Z5ciRI9q/f7/mzJljvho4LCxMFRUVqqysNL/r0KFDbtfimhQ1PDxcVqtVL7/8ssrLy7Vr1y63V/jGxsZqzpw5bk/k/vSnP8nhcLi9bvroONPT03XRRRe5NVoWLlyozMxMrVu3TlLNq4OfffZZLV26VF9//fVx3xhztFmzZpmvD/7uu+/M9a4nklLNE7Ru3bq5vcXl6PKJut4ktHTpUu3bt0/Lly/X9ddfr/Xr19f5Jprjefvtt9W2bVt1797dbf3u3bvdygykms6mv/3tbyovL1dqaqo2b95c7+8BAPgX7acatJ9oP0kNaz+NHTtWN910k3788UcNGDBAwcHBZiflieaUqq6uVmVlpVq2bCmpZs6tfv361Zqjqi4HDhzQTTfdVOdbMAFvoHwPaKAbbrhB5513nqSa16u+++67ddaUL1myxCwdOnoY73fffaf4+Pg6X+EaHR2tKVOm6I477tD48ePVs2fPWm+/KCoqUnV1tQzDMN+K4qo/l6T//Oc/5jqHwyHDMOR0OnXkyJFaT+NO1fTp03XDDTfo559/Vn5+vrKystSmTRu3feq6vmOFhobWOW+EJP32t7/Ve++9Z/7gNQzDHL5+PHl5eZLcR+QkJSWpZcuWatmypbp06WKuDwsL04oVK9wmRpWkGTNmKDo6Wm3atFFMTIz+/ve/a+3atWrVqpViY2PVoUMHc+4DqWaSyjlz5igpKUkdO3Y0P/fee68OHTrktq5Dhw61OmBcXA2+Y0cNhYWF6fPPPzdfkyzJnNT7eE/ljnW8V1p36tTJzMmaNWuUkpJibvvVr35V59vzXDZu3Kh77rlH06ZN05AhQzRt2jTdcMMN5ht4Tmb37t2aO3eu7rjjDrf47Ha7SkpKanVKSVLfvn3NoegnehuPS332AQD4Bu0n2k+0nxrefoqOjq7VGffss88qODhYVqv1uHNKtWjRQpdddpmkmtFcGzZsUK9evU56zVLNKK433nij0UYIAidDpxTggZP9Y11Xw2L9+vXHHSYsSQ8++KCKi4v1j3/8Q7Nmzaq1vVWrVrJarfrvf/+r5ORkPfHEE3WeZ8WKFercubMWLFig6upqhYaGusWzdu1arVq1yu1TUFBwwus5+rref/99ffbZZyooKNDWrVvNRl1D9OvXTz///LMWL16sdevWaebMmWZHwpQpU7Rnzx5df/31WrVqlR544AHzyZ/LkSNHtGHDBq1bt05z587VX/7yF1100UVuw7etVqt69uypnj171pogMzY2tlZMU6dOVXFxsQ4ePKgpU6ZozJgxevfdd5WcnKz33ntPe/fu1WeffeZ2zJQpU3TkyBE5nU5VVVWpqqpKf//739W2bVtz2fU5ePBgnblwNaaSk5Pd1g8ZMkTt27fX9ddfr/fff18rVqzQrbfeqt69e7uVMOzfv18bNmxw+xybr2NNnz5d06ZN03/+8x+9++67Gj16tG677TbNnj1bs2bNqtXQcXn11Vd1+eWX68YbbzTnoJg8ebKeeOIJ3XHHHbr44ovdJtc81s6dO3XllVcqOjrarVRAkvlUtq5OqaMd/ZTyWJ988on+9Kc/6eOPP67z7xgA4F+0n2g/uWKl/VT/9pPLqFGjtGXLFm3btq3OOaV++OEHfffdd+a8VG+99ZYqKip0xRVX1Hk+HuLB3+iUAjy0f/9+7dixo9bnwIED5itwXUpKSvSf//zH7Yfh4cOHzScxlZWVGjdunEpLS9W9e3fdeOONyszMdGuw5Ofn6+6779Zll12mG264wRzefOyQ9D59+mjw4MG677771LNnz1qv5/3d736n3/72t24f1xDnk7ntttu0fft2jR07VhdddJF69OihyMjIWj8YT6Zr16568cUXNX36dF166aV65ZVXzG29evXSBx98oB07dmjw4MHavHlzrVczf/fdd0pJSVH//v319NNP65ZbbtHy5ctrfU/v3r3rfHOMi9PpNP+uDh48qLfeeksDBgzQ119/rfnz5ysyMlKLFy/WjTfeqPHjx5tPFCsrK7Vx40b98MMP2rFjh7799lvzTTN79uxRdXW129tnvv/+e/3000/6+uuv9f3337vFcPbZZys4OLhWnBEREfrkk08UFxenW265RXfccYeSkpK0cuVKt0b966+/rpSUFLfPQw89JKlmwtDS0lLl5+e7HeNwOPTss89qyJAheuihh5Samqo+ffooIyNDPXv21IoVK9xi+fTTT3XNNddo1KhRGjNmTK039aSlpemjjz7S3r17dfnll6tr165uT/4qKiq0ePFipaamqqSkRB988IHCw8PNc0+ePFljxoxRTEzMScsXju2UcjWoDMNQixYtNGvWLCUnJ+vOO+884XkAAP5B+4n2E+2nGidrPx0rLi5O55xzjpKSktzm7pRqSvoSExPVtWtXsy21cOFC/epXv6rVttq4caOeeeYZLVq0SK1atTru9wFeZwA4ZSEhIYak4346dOjgtv+f//xnIygoyNi9e7fx3XffGf369TNCQkKMO++803jhhReMLl26GG3btjXWr19vlJSUGLfddpshyYiIiDDeeOMNwzAM48svvzR69uxpvP/+++Z5n332WaNbt26G1Wo1vv32W7fvzM3NNX79618bn376aaNdd8eOHY1JkyYZn332mfHll18aH374ofHb3/7WOPfccxvtO3xpxIgRxo033miUl5cbycnJRnJysvHOO+/U2m/37t3G0KFDjcTEROPnn3829u3bZwQHBxvh4eHGGWecUe9PaGioMXz4cJ9d33fffWfek0899ZThcDiM2267zYiJiTFatWplzJo1y23/Q4cOGSNGjDAkGe+9955hGIYxdepUQ5JxzjnnGP/5z39O+H1lZWXGrFmzjE6dOhlffvmluf711183LBaLMXLkSOPnn392O+bHH380zjjjDGPAgAHGunXrGnyNeXl5hiRj586dhtPpNKqqqhp8DgCAb9B+ov1E+6m2utpPTqfTePTRR42rr77aaN26da1jXnnlFfP/lyVLlhidOnWqtU9JSYmxdevWWuu3bNlihIWFGT169DCWLFlSr5wA3kCnFOCBHTt2GGVlZfXef/fu3cbixYsNw6j5IXPjjTcaM2fONPbs2WNcdNFFxg033GDs27fP7ZjPP//cGDp0qFFaWnrc8+bk5Bj33HNPozacTuSll14yzjvvPCM8PNwICgoy4uLijGHDhhnr16/3yfd7k91uP+k+JSUlPoikcb3//vvG7t27zeWXX37ZePzxx42CgoLjHvPBBx8YTqfTMIyahtKyZcsa1NlTXV1da93333/fgKjrLzs725DktfMD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5pmqrq72OFYAAIATObp8LxDmlKp3p9SuXbt0xx13qKysTHfccUed+/To0UMzZsxotODi4uLkdDq1d+9eRUdHKzc31217cXGxgoOD6zx28uTJmjhxorlst9sVHx+v2NhYsxHYmIqLi7X/wH4ltEyQTj7Pe4M57A7t+GmHwsPDFRcX1/hfEMCcTqcsFotiY2P5ZakRkVfvIbfeQV69h9yeWGhoqEfH5+bmunU4zZgxQzfffLNbe+Top5YAAADe0iTL9yQpLCxMF154of7xj3/owgsv1Jo1a9y2Hz58WK+88ookKSIiQsOGDWvwBaalpencc881J0DPysqS1WpVfHy8UlJStHDhQnPf/Px8ORwORUdH13mukJCQWiOrpJrRXd5ocLtK62SRLFYv/MVafikRbI6/MLiuuzleuzeRV+8ht95BXr2H3B5fY+ekrg6oQGgUAgCA01+gle/Vu5UVHR2tu+++W8HBwbr77rtrbbfb7frnP/+pN998U/fff7+ef/75BgfTp08fTZkyRR9//LE++ugjjRs3TqNGjVJYWJj69+8vu92uJUuWSJLS09M1YMAAc64rAACAQGSxWNw6nY5dBgAA8JWjR0o1qfK9H374QZdffrlKSkp0+eWX19reqVMnvfPOO5Kk6dOnq6SkpMHB3HLLLdq8ebOuu+462Ww23XLLLUpPT68JNChIixYt0vDhw5WWliar1VprtBYAAECgMQxDv/nNb8wHaXa7XVdffbU5BUFVVZU/wwMAAM3I0XNKuV7W5k/17pRq166dMjIydOWVVyojI0PDhw+vtY/D4dDWrVv16KOP1nuo+7FD2DMyMpSRkVHnvkOHDtX27du1ceNGpaamqk0bL0zeBAAA0Ihco7wBAAD87djyPcPPvVINnlPKZrPpwgsvNNcffUF///vf9fjjjysnJ8drrzVu166dBg0a5JVzAwAANLbbbrutzvW7du3S4cOHdc4555hvMwYAAPCmYyc69/fLVupdQOgKtLi42Czfq6ioUHl5uaSaixk1apRSU1P10EMPeSFUAACApmfv3r26/vrrde2115rrHnnkEZ111lnq16+funbtqk2bNvkxQgAA0Fy4yvcCYZJzqZ4jpSorK+VwOCRJ//znPxUcHKygoCAFBwfrs88+U3V1tTkfwtNPP62BAweqoqLCnCsBAACgubrtttvUunVrPfbYY5Kk1157Tc8//7w++eQT9e/fX4899pjuv/9+rV271s+RAgCA051rwFGgvHSlXp1SLVq00Oeffy5JGjZsmLZt26YuXbpIktq2bavKykr94Q9/kFRzgVlZWXRIAQAASPriiy+0ZcsWdejQQdXV1Zo6daoeeeQRXXLJJZKkcePG6ZlnnvFvkAAAoFlwle8FykipepfvxcTEmH8+77zzVFlZqa+++kpSTafV3XffLalmOPoDDzzQyGECAAA0Td26ddPHH38sSZoxY4YKCws1YcIEc/unn36qM88801/hAQCAZsRVvme11Ls7yKvqPavmn/70J4WGhurw4cOqrKxUcXGxzj//fPXs2VN//OMfNWrUKB08eFD//ve/9dZbb3kzZgAAgCZj3rx5GjZsmO6++25ZrVa9+uqrCg8P1w8//KAxY8YoKyuLN/QBAACfaJLle1JNg2rUqFHmnw3DUO/evTV16lTNnTtXc+fOVceOHTV48GBdeeWVXgsYAACgKfn22281bdo0lZWVqbq6WiUlJXrllVe0Z88eDR06VL///e9VUVHh7zABAEAzEGjle/XulGrTpo3mzp1rLh88eFAhISG67rrrNGjQIP3qV7/Su+++q2+++cYrgQIAADRFt99+uywWi2w2m/r166eWLVtKktsrmF1vMQYAAPAmV/ujyZXvHThwQA888IC6deumW2+9VZJUWlqqRYsW6dlnn1VqaqqGDRumG2+8Uf/73//UunVrrwUNAADQVDz//PPKy8tTbm6utm7dqsjISCUnJ6tPnz5KTk5WcnKyzjrrLH+HCQAAmgHXnFJNrnzvT3/6kxwOhz799FP95S9/0csvv6wffvhBX3/9tV577TX16dNHkpSbm6s//vGP+tvf/ua1oAEAAJqKe++912157969evfdd/WPf/xDU6dOlSRFRESosLDQH+EBAIBmpMmW702aNMn8c2Zmpnr06KHVq1crNTXVbb+pU6e67QsAANCcrVixQnl5edq8ebM2b96sHTt2KDExUcnJyZo9e7Y5agoAAMDbmmz5XlxcnEJDQxUUVHPI448/Xud+kZGReuGFFxonOgAAgCZuyJAhslgsslqtOv/883X11VfLZrPJ6XQqJydHOTk5evXVV/XSSy/5O1QAAHCaa7Lle6GhoVq/fr1KS0s1aNAgrVmzRoZhqFevXtq8ebMkqaqqSg89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yZIl8Pf3R1BQEN566y3MmTNHKr3w4MEDZGRkYOjQoQDapua1FyJfsGABMjMzsW3bNnh6eiIhIUEWnGo3dOhQGI1G6PV6zJ07V9rfr18/6HQ6GAwGRERE4OjRo9BqtbIVBE0mEwoLC5GXl/fId/Drr78iPDwcu3fv5tQ9on9KEBGREEKIpqYmodfr/1bbmpqa/7g3RERE9P9w584dsX37diGEEDk5OSI+Pl6cP39ehIaGioSEBKHT6aS2WVlZIi4uThgMBuHr6yvi4+OFXq8XLS0tQqVSCXd3d3H48GGpfVFRkQgMDBQLFiwQQghRWVkpfvnlF9n1DQaDcHZ2Fj4+PqKwsPCJ+j558mShVCrFSy+9JGJjY4XJZPpHz+DPP/8UP/zwg/T/kpISMX/+fOHg4CAePnwodu7cKeLi4oSbm5uYPn26qKysFD/99JPw9vYWfn5+orS0VAghxNq1a0VISIjIysoSNTU1om/fvmLkyJEiOztbdr2qqioRGhoqTp06JYQQYurUqcLT01Okp6d32seGhgaxefNm6VkKIcS8efNE//79xTfffCNr+8EHH4j169eL69evC2dnZ9mxe/fuSdftaODAgcLb21t89913nfbhypUroqCgoNPjRPR4CiE6KaxCREREREREANrqOllZdT7RpLGxUZZVs2bNGtjb2yMxMVFaUa/9PC0tLRZXuPu3mpuboVQqn/oqwA0NDVi8eDEiIyPx5ptvIjk5GT179kRUVBT69esntTMajdi6dSsWL14sZTZ1VFdXBxcXl8deT6/Xw9bW9omfkdFohK2t7SPfExE9WxiUIiIiIiIiIiKiLscQMhERERERERERdTkGpYiIiIiIiIiIqMsxKEVERERERERERF2OQSkiIiIiIiIiIupyDEoREREREREREVGXY1CKiIiIiIiIiIi6HINSRERERERERETU5RiUIiIiIiIiIiKiLsegFBERERERERERdbn/AZ/HvF/6zUkrAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LightGBM损失统计信息:\n",
      "- 最小损失: 0.000336\n",
      "- 最大损失: 277.720616\n",
      "- 简单平均损失: 2.187918\n",
      "- 按数据点加权平均损失: 2.044430\n",
      "- 损失标准差: 16.487504\n",
      "- 损失中位数: 0.117037\n",
      "\n",
      "数据点统计信息:\n",
      "- 最小数据点数: 400\n",
      "- 最大数据点数: 2422\n",
      "- 平均数据点数: 2109.1\n",
      "- 总数据点数: 632729\n"
     ]
    },
    {
     "data": {
      "image/png": "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IXADQJDyer36+uuvtWLFCv85yatXr9aAAQPUv39/f2/blVdeqRdeeEGNGzfWFVdc4R8uXjQTcEZGhjwej1wulwoKCpSenu6fACkzM1Pp6enKzs72D+su6qHt27evbrrpJt1888266KKLtGHDBl155ZVq1KiRunfvrr/97W/q27ev3nvvPUnStddeq6uuusofCOrVq6f3339fUmGw6tevn+655x6tWbNGcXFx/uHSKSkp6t69u+bPn6/Y2NgSX4usrCylpqb67xc1QOzduzdgMjmpcJh50fB1SXrwwQd19913q1u3brrooouUmZmpJk2a6MYbb1SbNm3UoEEDPf744/4e58aNG2v06NHq3bu3pMJh9B6PRzVr1iz2WMfjcrmK9UgWBW2zwnZ5mzNnjq644gpVqlRJUmFPbevWrbVhw4ZS97FYLPL5fP5zmOvWrav8/HytW7dOHTp00KZNm06qEUYqHLmxatUqFRQUaO3atYqPjw8Y5p+amqqDBw/677do0UI//PCDGjduXKbj/9///Z/+7//+Tz/++KOuvPJKffrpp5IKJ+I7Otwe69hTDV599VXt379fmzdvVuXKlSUVfm5r166tTz/9VO3bt/cvc7vdxd43DodDdevW1a5du/zLGjRoIIfDoeeee07NmzfX2rVr/Z9pt9stp9MZ8J602+3+89CP/tx06tRJ11xzTUCjU1E5Shoa/+233/pHY0yePFmTJ0/2r+vRo4emT5+uatWqlfraAMC5isANAEHK5/Np6NChevLJJ/090i1atNCIESM0YsQI/3ZXX321MjIy5Ha7A4Z5Fl0y69gepaOHQzdr1ixg3dE/pn/99Vf1799fderU0euvv67LL79cTZo00a233qqpU6dqyZIl6tGjh3/fAwcOqFq1aiUOcZcKQ/Pw4cNVp06dgOU2m02rVq3y9xr7fD4VFBQE9LbPnDlTQ4cOLXbMks4FPbb3bd68efrHP/6ha665Rt27d9f999+vJk2a6Nprr9WECROUnJzs76kseh7Vq1f3D+l9//33NWjQIIWGhioqKqrEsHE0n8+n9PR05eXl6fXXX9ddd93lX7d161bVqVOnxOHGJTmVYF403PvoEFZk6dKluu+++7Rr1y517dpVNWvW1KxZs7Ro0SL/Nlu2bNHAgQO1cuVKNWjQQG+99Zbatm2rJ598UmPGjPFvVxTi7r77bv+50UlJSbrpppsCHnPKlCml9vhv27ZNkyZN0uWXXx7wXIuCYkxMjKxWqxo1anRSr0GDBg20Zs0abd68WevWrVOLFi20bds2//qePXtq8uTJqlKlikaNGqVq1arpiiuuOKnHONahQ4f05ZdfHvcUgC5dumj+/PmSCt9njz76qMaPHx8Q9ItGXFxwwQWqXr36cR/z6M/70TZs2KC33npL33zzTcApDkUNd8fOk1DW0zysVmup8xPceOONatiwoRo1aiSPx6PevXtr1apVmjBhgu6//3599dVXev/99/X222+X+h0BAOciAjcABKmSrlVrs9n022+/6frrrw84x1OSWrZsqf/+97/++1dccYV+//13hYWFFdv2WG63Wz6fLyBMzp07V9dff73GjBmjmTNn6s4779RVV12l999/X7NmzVLVqlUDZts+cOBAwPnhRbKzs5WZmalhw4apd+/euuqqq5SamlrsXOeiHj6psLd87ty5/vtFP9CPd5mzhQsXqkuXLgE/5j0ej77++ms9+OCDuu+++zRhwgTddNNN6tOnj8LDwzVlyhRVq1bN/zxycnKUlZUV8Dzuuusu3XXXXdq3b58++uij476ORbp06VKsMUMqDNzr168/7jngRRwOh3JzcwN6HU9HVlaWbrzxRg0cOFDdunXTQw89pNTUVM2dO1cJCQlavXq1srOz1a1bNw0cOFCjRo3Sgw8+qMGDB2vlypUaNGiQevbsqVWrVmnw4MH69ddfJSmgcePQoUOKiooKeNxatWoF3M/IyAio+3r16mnevHkB2zRv3lzr1q1TTEyMmjRpUmqwLI3ValXTpk21bt06rV27Vs2bNw8I3M8++6zS09M1ZcoUTZ8+XQ888ICeeOKJgDB5dM9wkWXLlvl7nSX5G06uuOIKVatWTbfccotq1apV4uXqHnroIW3dutV/Py4uTj/88EOxKwwUTSAXERFR7Bhut1uGYQR8Tg3DCLjEnWEYat68uebNm6fc3Fzdfffd/kkEi0YRnKjR6HiKzlE/NqTHxMToyiuv1I8//uj/fC1fvlytWrXyb/Phhx8qNzdXH3300QlPywCAcwWzlANAkPJ6vTp8+LC2b9+u33//3b88LCxM33//vdq2bau2bdvq4osv1pw5c0r8Ed24cWMlJiaqQYMGx70lJiYWm6X77rvv1l133aXt27dr0KBBat26tVJSUtS8eXNFR0dr2rRpOnjwoHbs2KFDhw7p0KFDASEzKytLL774oho2bKht27bp6aef1uzZsxUaGqpmzZopLS1NaWlp/p7YvXv3Ki0tTYcOHfIPUy9yMj1iRzcu2O12/fvf/1a3bt30448/6pFHHlHHjh21d+9eXXzxxYqPj9e0adO0YsUK5eXladOmTapUqZLq1q1b7Lh79uzRsGHDVKtWLdWrV0/16tXTzz//rM8//9x/v169ehozZkypl/365JNPSpyd/djb2LFjVbdu3TMWtqXCnuu0tDQ9+eST6ty5swYMGKD9+/erXbt2/pCcmpqq++67T4899pi6dOmiUaNG+c+Frlmzptq2bevvjS16/x09AVZBQYG/zI8++qh/du+i86KlwiC5evVqrVq1SjNmzFB+fn6xXuGiHu5169ad8Pzi0hzvGGFhYXr33Xe1cuVKXX311Xr22Wd19dVXB/TEN2rUSKtXrw64FYXjDz74QBdffLF/NvVbb71Vb731VkBAT09PV1xcnP+0CkkB9Tlx4kS1adNGISEhATOhF50L3rhx42KzpDudTv8VAors3r1bkZGR/tuOHTtksVj0t7/9TTVq1NC7776rX375RVLJgbtjx47+uRCOvv30008aNWpUsTLYbDZdcMEFAWXIzMzU3Llzdccdd6hTp07q3r27Vq1apebNmysjI0P79+9XkyZNdN999+nzzz/XgAEDjtt4BgDnEpoXASBIZWVlFTsXUir8of7hhx/qtttu04UXXqilS5fqv//9b8DQ5aIZjfPy8k7qMT0ej7xerxwOhx588EF9+eWX8vl8MgxDo0aN0qhRo5Sbm6tnn31WvXr10lVXXaXPPvvMH9yPPkfz0KFD+s9//qMnn3xS77//vn828fT0dMXHxxcbLl25cuUSe/WkI739JQ2TLvLnn3/6n8PRbrvtNq1fv14ej0chISH+a4jn5OToww8/VK9evVS3bl19++232rt3rzp06FBij2pR6C8KklLh8N+CgoKAiayysrJOu/du//79xULN6UpISJDD4dCXX36pHj16aP78+WratGnANlarVUOGDPHfr1q16kmdtx4REaGcnBxJ0gMPPKDbbrtNr732mjZv3uzfxmaz+Xs9L774YkVHR/vPhy7SvHlzbdy4UZUrV1a3bt0CLtlVVs2bN9ecOXO0YcOGYr3IRdq0aaNvvvlGU6dO1dChQzVlyhQ9+OCDkgpD+dG9s8dq0KCB+vTpo4ceekgPPPBAsfW5ubk6fPhwqZOEDRo0SH//+9/lcDgCgvhDDz2k2bNnq1atWlq2bJn/vVQ0U/mxQ7rr1Kmj3377zX//6PPd27ZtqyuvvFLjx4/XZ5995m9QODpwz549W1JhvRS9r/ft26dLL71U4eHhWrJkScBpIEVzGhxtxYoV6t69u6TCBq/PPvtM7733nvLy8mSxWBQREaHIyEiFh4eradOmeueddxQfH68JEyaU9vICwDmDwA0AQerw4cOaMWOG7r77bv853JJUrVo19e7dWxMmTNBbb72lV199VTfddFNAr+w///lPTZ8+/ZQet2iW8aLh023bttW9996rf/7zn9qxY4cuvPBCf29437599dRTT6l169bq0qVLwHESEhK0detW1apVSx988IF/+bZt29SgQQPdc889+vrrr/09XUU9pQ0aNNDy5csDjlUUFEoasn4st9sdcDmvX3/9VW63W/Xr19cbb7yhHj16aMmSJbr++ut13XXX+Z/HSy+9JK/XqxtuuKHE4xaVYeDAgf4QNHfuXKWlpen222/3b/fUU08VCySHDh3S7t275XA4Sh0e7fF45Ha71aZNG+3bt6/Yue6nqyjs3HXXXcrPz1fjxo31zTffBGxTs2bNUs/RLYsGDRooOTlZklSjRg3VqFHDP4FaaYpm1j56JvGmTZvK7XZr4cKFGjFixCkH7gcffNA/vLzI6tWrde+99+p///ufmjRpIkkaMmSIXn311VJHJhyrd+/e+vvf/x7QSCAdmTdBKpxLoOi5FDn6fREbG1tsksDk5GR98sknmjFjhp544gm9+OKLev75549bFqvVGjCs/9hREQMGDNDgwYOVlpbmnwn+6OHgJTUIjBkzRomJiapevbr+/e9/a8GCBcc9z7tTp05asmSJqlevrtjYWFWqVElOp1ODBg2Sx+Pxn+Nf5KmnntLFF1983OcFAOcKAjcABKF9+/YpNze31IA5duxYNW3aVNWqVdNnn30W0MMlFU5UNXXqVIWEhCgvL085OTn+H+W33Xab7Ha7Zs6cKamwx6qo97agoCDg3PEvvvhCq1atUqdOnTR//ny9/fbbuvXWW/3luu222/Too4/q448/LvHyTceevytJK1euVLdu3bR8+XL9+9//DpgFee7cuXrkkUcCts/Pz1fHjh1LHYJ69MzqRc/hWK+99ppSUlK0atUqRUREaPTo0brvvvv8YXDIkCEaN26cDMMIuB700Ro2bFjsesZRUVH+a6IXeeONN4rNqv3NN99owIABcjgcpfZ+G4Yhl8ulnJwc7d2795SHUpdm6tSpSkxM1OLFi3Xo0CElJCQUC2dlOVe6qHfU4/EUey5dunTR1KlT/Zf0knTCEJuUlCSpMKAXjWBwOp1q0KCBtmzZclpDyqXCRoCjGxHi4+O1du1arVixwh+4vV6v0tPTSzyVoCSlXWs9OjraHySXLFmi+vXr+0P1hRdeeNy5FFJTU3XjjTfq6quv1l133aULLrhA3bp1U0FBgSZMmFBsorOyuummm9ShQwfFxMRo27ZtCg8PP249T506VW+88Ya+/vprNW/eXK1bt9ZVV12lzz//vMTPs1R46kb79u3Vr18/DRo0SFdddVWxbVavXq2nnnpKb7zxhkaPHn1KzwUAKiICNwAEoV9//VUWi0UtW7YscX3dunU1aNAgjR8/XgMHDtRFF10UsL7ox3laWpp69+6tP//8U8uWLSvW25iRkaH27dvrqquu0ujRo1WzZs2A9T169NBPP/2khQsX6u6779Yff/yhK664QgsXLtQ111yjzMxMRUREKDQ01H+pseMxDEO//vqrJk6cqBUrVpS4zbFh5ptvvtFNN92k5cuXq3r16ho4cKA++ugjVa5cWR9//LFee+01LVy4UJI0adIkff311/7rhhcZPHiwLrroIi1cuFA9e/ZUdna2oqOjtXLlSrVt29Z/rXKfz6fDhw/7L7l2tH//+9/6/vvvA4JP0ZDyoxsN3G63LrnkEn3yySf+ZXfffbfuvvvuE74+RXbv3l1iD/cvv/ziv5xakcaNG5epN9xms+mnn37SnDlzlJCQIJfLpQsuuCBgNEBZNG3aVJGRkf7znlevXq2bb75Z1apV07BhwzR9+nT16NFDo0aN0ooVK7R48eKAAOb1erVy5Up5PB4lJSXpiSeeUL169dShQ4eAUwaaN2+u1NRU/6kIJ6t69eqqUqVKseHktWrVUs+ePfXII4/IYrGoTp06evvtt3X48OGAc8nz8vK0cuXKgH3tdvtxh5nfcMMNuuGGG7Rv3z6NGzdO9913n15++WUlJSXpmWeeKfWa8StWrNCdd96p8PBw/znfnTp10pw5c/R///d/+uqrr/T444/rrrvuKtbI4fF4Al63Y0dXRERE+EcRpKWlFZvUrkh2drZGjRqlyZMna9q0af4h4osWLVKXLl104YUXatiwYXrggQeKXefd5/Opb9++mj9/vm6++eYSj+/xeLRmzRq1bt1aH3zwgS6//PJSXkUAOLcwaRoABKFPP/1UrVq18s/cXTQbclEY/eKLL/TGG2+oXbt2euutt3T//fdr9+7d/v1dLpemTp2qZs2a6cCBA3rnnXf8Ydvr9fq3Cw8P17Bhw/TVV1+pQYMG+s9//hPQQ2y329W8eXPl5eXJ7Xbro48+UufOnTVv3jz9/PPPateunVq1aqU+ffqoW7du/kseHaugoEBxcXFaunSp4uPj1aBBg1J7rI8un1TYW9++fXtdeumliouL0/Lly/XWW29Jkpo0aaLFixf7h79fdtllWrx4cbFJ1xwOh5o3b66DBw8qOjpaX3/9terXr68ffvhBX331lS699FL17dtXbdu2VadOnYqNGJCkl156SRs3btT27dv9t6FDh+qGG24IWLZz585ij38yUlJS9Oeff5YYogcPHqwuXboE3I4O9sdzyy23KDc3Vw888ICuvPJKXXTRRYqOjtbDDz98UuWLiorS7Nmz9c4776hjx4564YUX/KMiqlWrpsWLF0sqDJ9ffvmlBg0aFLB/dna22rVrp8suu0yjRo1S586dtXjx4mI9uM2bNz/tXv7SjjFz5kzdeOONeuyxx/R///d/+v333/Xdd9+pfv36/m22bt2qdu3aBdyKJn/z+XzKzs7W9u3biwXgb775Ru3bt1ejRo00YsQIJSQk6Mcff1SDBg00adKkgEC8detW3X///brssstUp04dLVy4MKABpHPnzlq1apXq16+v/v37+4d4F/H5fNq3b58SEhL8t99//73EKxxI0qZNmwKuBiBJO3fu1FNPPaULL7xQn332mRYsWKB+/foFvIa//PKL2rdvr6efflrVqlXTNddc4z9X//Dhw7ruuuv0448/6ocffgi4LJzH4/F/Z7Vr106rV69WgwYN1KlTJ/8IGwA45xkAgKCyadMmw263GxMmTDAMwzDuuOMOo2bNmkZ0dLTx3XffGTfeeKNhsViMp556yjAMw5g5c6YRExNjWCwWo3fv3obP5zOysrKMa6+91nj00UcNl8tlGIZhbN++3Wjbtq0R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dHS0LBaL//bMM89IkrKysjRgwABVr15d9erV0+TJk/37eb1eDRkyRFFRUQoPD9fAgQPl8XhOuB8AAABQERG4K7D7779fLVu21Mcff6z//ve/atmypQ4ePKh//vOfGjp0qFq1aqVdu3bpww8/VL169SRJF198sVJTU7Vnzx7Vrl1bP/30k/r27avPPvtMw4YN05133qmVK1cqLCxM1apVC3i8p59+WkOGDFHNmjV1xx13aN++fZKkkJAQWSwWXXHFFXrxxRc1btw45ebmnu2Xo0xmzJihRx999KT3e+aZZzRlypRS16elpenf//73aZTsiN69e6tSpUr67bffFBISorFjx0qSMjIyNHToUH3//fdav369pkyZohEjRpT5uLt27Tpug8CECRO0YcOGMh1r27Ztio6OVlpamv9WVJYhQ4YoOTlZy5cv14wZM/Tkk09q+vTpkqTx48dr9erVWr58uX7++Wd98cUXevvtt0+4HwAAAFARnfeXBavIpk2bJqmw57VVq1YaMGCAPvroI2VlZalv374yDEOffPKJnnvuOW3btk1NmjRRamqq1qxZo+XLlys1NVWXXHKJ3nvvPU2ePFnbtm3ToEGDJEm5ubmKjY31P9bnn3+uefPm6eeff9aUKVO0b98+rV+/Xu+//7527NihgQMHqkqVKmrevLkaNGigvLw8U2Z+X758ubp161ZseUREhPbu3XvcfZcsWaKXX35Z/fr1U35+fpkfc8aMGVq6dKluvPHGUrd56KGHzshl5dasWaMVK1Zo165dql27tp599lm1bdtWY8aMUWZmpl588UW1aNFC0pHGkzNh27Ztev755/0NMyfy66+/qkOHDoqOjg5Y7na79eGHH2rZsmWqV6+e6tWrp/79++uLL75Q//79dejQIc2ePVv169eXJHXv3l2rV68+4X4AAABARUQP9/Hk5ZV+OzawHW/bo4YEH3fbk7B37141btxYbdq00aeffqqnnnpKTZs21b59+zRjxgzt2LFDu3fv1nPPPae1a9fq3nvvlSR9+umnuv/++5Wfn6+wsDCtXr1a1113nV5++WXt2rVLU6ZM0dq1a1WpUiXl5OQoIyNDkvT1119r//79uuyyy/TMM8/orbfe0o8//ii3262GDRtq1KhRWr9+vWbPnq0RI0Zo//79AeW95557TqoHuEGDBgHDpR9//HHddttt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986dO3X77bdrypQpatq0qSRpxIgRat26te644w5J0rJly2S1WlWnTh21a9dO06ZNC9jf7XYrNja2xOM7HI5iPeKSZLVaeYOfARaLhdcySFE3wYu6CV7UTfCiboIXdRO8qJvgRd0ErxPVzenU2VkP3Hl5eerZs6duuOEG3XjjjcrOzpZUOBHa448/rmrVqsnr9eq+++7TXXfdpfDwcHXs2FGZmZl6++23de+992rs2LG65pprZLPZznbxAQAAAAAok7MeuOfPn6+kpCQlJSUV67X++9//rptvvlk2m019+/bV2LFjCwtpt+vNN9/U7bffrhEjRshqtWrJkiVnu+gAAAAAAJTZWQ/cN9xwgwzDKHHduHHjNG7cuBLXXX/99UpOTtaqVavUvn17xcXFmVlMAAAAAABOS7nOUn6yqlevrh49epR3MQAAAAAAOCHO2AcAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAE5RK4v/jiC9WvX192u12tWrXSpk2bJEkbNmxQu3btFBMToxEjRsgwDP8+S5cuVZMmTVSlShVNnDixPIoNAAAAAECZnfXAnZycrHvvvVfjx4/Xvn371KhRIw0YMEBut1u9evVSmzZttHLlSiUlJWnGjBmSpJSUFF1//fW6/fbbtWzZMs2aNUuLFy8+20UHAAAAAKDMznrg3rRpk8aPH6/evXurWrVqGjJkiFavXq05c+YoIyNDEydOVGJiosaOHavp06dLkmbNmqWaNWtq1KhRatiwoUaPHu1fBwAAAABAMLKf7Qfs2bNnwP0tW7aoYcOGWrt2rdq3b6/w8HBJUosWLZSUlCRJWrt2rTp37iyLxSJJuuSSS/Too4+e3YIDAAAAAHASznrgPlp+fr5eeOEFDR8+XNu3b1dCQoJ/ncVikc1mU1pamjIzM9W0aVP/uqioKO3fv7/U47rdbrndbv/9zMxMSZLP55PP5zPhmZw/fD6fDMPgdQxC1E3wom6CF3UTvKib4EXdBC/qJnhRN8GrLHVzOvVWroH7iSeeUKVKlTRgwAA9/vjjcjgcAeudTqdyc3Nlt9sD1hUtL824ceM0ZsyYYstTUlLkcrnO3BM4D/l8PmVkZMgwDFmtTHIfTKib4EXdBC/qJnhRN8GLugle1E3wom6CV1nqJisr65SPX26Be9GiRZoyZYqWL1+ukJAQxcbGasOGDQHbZGVlKTQ0VLGxsUpJSSm2vDQjR47U8OHD/fczMzNVp04dVa1aVVFRUWf+yZxHfD6fLBaLqlatypdFkKFughd1E7yom+BF3QQv6iZ4UTfBi7oJXmWpG6fTecrHL5fAvXPnTt1+++2aMmWKf6h4u3btNG3atIBt3G63YmNj1a5dO82ePdu/bvXq1apVq1apx3c4HMV6yyXJarXyBj8DLBYLr2WQom6CF3UTvKib4EXdBC/qJnhRN8GLugleJ6qb06mzs17beXl56tmzp2644QbdeOONys7OVnZ2tq688kplZmbq7bffliSNHTtW11xzjWw2m66//nr99NNPWrhwoQoKCjRhwgRde+21Z7voAAAAAACU2Vnv4Z4/f76SkpKUlJRUrEf7zTff1O23364RI0bIarVqyZIlkqQqVapo0qRJuu666xQREaHo6Gj/NboBAAAAAAhGZz1w33DDDTIMo8R19erVU3JyslatWqX27dsrLi7Ov27w4MG69tprtXnzZl155ZWKiIg4W0UGAAAAAOCkless5SWpXr26evToUeK6hISEgEuHAQAAAAAQrDhjHwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABMQuAEAAAAAMAGBGwAAAAAAExC4AQAAAAAwAYEbAAAAAAATELgBAAAAADABgRsAAAAAABOUW+A+dOiQEhIStGvXLv+y+++/XxaLxX9r0KCBf92GDRvUrl07xcTEaMSIETIMoxxKDQAAAABA2Zxy4Pb5fHrvvfcCln399dfasGHDCfc9dOiQevbsGRC2JWnlypX65ptvlJaWprS0NK1evVqS5Ha71atXL7Vp00YrV65UUlKSZsyYcapFBwAAAADAdCcVuD0ej6ZPn+6//49//CNg/bPPPqunn376hMe57bbbdMcddxQ79saNG9WxY0dFR0crOjpakZGR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GGpoaOCiiy7illtu4ayzzmLNmjWsXbuWu+++m40bNzJnzhzzfRMmTEj6bFNTE3/60584cuQIF198MRs2bDAXSPP7/ea86kgkwrvvvmt+3m638/3vf58777yzT3paWlooLCxM6iCvX7+ee+65h6effpqHH36YmTNn8vHHH/Otb32LQCDA3r17qaqqoqGhgblz55qfSwwVX7duHf2d3/d6vUlXxIUQQohPClk0TQghhBhDpaWlvPnmm1x//fV861vf4oEHHuD888/nmmuu4dprr+XQoUMEg0H27dvH9OnTATh48CBf/epXWbNmDVVVVTz33HO43W6++93vsn//fvbv309ubq75//v27UtaidxiOXHz33Pe91VXXcWWLVtoa2vjnXfeMdPp8Xi49dZbefPNNwGS0tjT9773PfLz86moqKCkpIQf/ehHVFRUUFFRQTwe55577jnZ3SiEEEKMS3KFWwghhBhDhw8fZv78+cTjcYLBIF/84hcJBAIUFBRQU1PD0aNH2bRpE2+88QYrV64EYPfu3Wzfvp2f//znVFdXA9DW1pZ2NfPew7nD4TC//OUv+fWvf93nvYkr0aFQiIyMDAAeeugh1q1bR1tbG16vl6lTp9LU1MSdd97J6tWrOf300+no6GD37t1JV7gTLBYL69atw2azoes6wWCQX/ziF4CxuvpATgAIIYQQpyJp4YQQQogxVF5eztGjR/nsZz/Lb37zG/bv388111zDV77yFQC+9rWv8fOf/5y//OUvVFVVAVBVVcUbb7xBeXm5uZ3t27dTUFCA0+lk/vz5VFRUMH/+fIqLi/nd735nvu/QoUPccsstBAIBjh49SktLCy0tLRw8eJAjR47Q2tpKPB4nFAqZn/ne977H9u3bKS4uZvfu3ezevZv8/Hy+9KUv4fV6ueCCC7jyyis5//zzk1YnT1i6dClVVVVUVVWxdOlS7Ha7+feKFStYsGDBSO1eIYQQYkzJFW4hhBBijAUCATo6Orj33nt56aWX2LhxIzt37gTgkksu4YYbbuD88883r2BrmobH40naxkcffcT9999PaWkp7777rvn8zTffjMPhMP9+4IEH+OCDD3j55ZdZvnw5P/zhD1m+fDmrVq3ioosu4uabb+ZXv/oVGzdu5OWXXzaHlr///vsUFRXxuc99jqysLObOncukSZMAWL16NUuXLmXjxo19ftuf//xnjh49yiuvvAKArutEo1FefPFFwLiiHolE2L9/PxUVFcOyP4UQQojxQq5wCyGEEGPM4/HwzDPP8PDDD7Np0yYuv/xyLrjgAjo6Oli7di15eXm8/vrrfe5XHYvF8Hg8bN++nYkTJ5KdnZ1y+4lh4q2traxfv54f/OAHAFx44YXmsPLVq1fz05/+FJ/Px3XXXUdtbS3r1683t1FVVcWWLVtYvHgxR48eJRgMsnr1ag4ePMhtt93GRRddxO23397nfuArVqzghRdeYOvWrWzdupXNmzeTnZ1t/r1lyxZee+21pKv1QgghxCeFXOEWQgghxlAsFuPxxx/n8ccfp7W1leeee46zzjqLZ555hiVLljB9+nRef/11tmzZwuWXX85bb73FL3/5S5544gleffVVrr32Wh5++GFWr15NOBymoaHBXNkcjHtoJ/6uqalh2bJl5tD0q6++mq6uLgBWrlzJlVdeSVtbGxUVFdx5550cOnQIMBZp27BhA4899hjLli3j9ddfx2az8bOf/Yxzzz2XX/ziF3z1q19l9erVzJs3j8cff5wlS5bwyCOP8Mgjj+D1es306LqOpmlmGsA4IdDZ2cmPf/xjLr300hHf50IIIcRokftwCyGEEGPst7/9LZWVlSxfvtx87sUXXyQUCnHZZZeZz+3atQufz5d2zrNSimAw2Ge4+cny+Xz86le/4itf+Yo5jFwpxbp167jiiivM5wCefPJJPv/5z/d7320hhBDi00I63EIIIYQQQgghxAiQOdxCCCGEEEIIIcQIkA63EEIIIYQQQggxAqTDLYQQQgghhBBCjADpcAshhBBCCCGEECNAOtxCCCGEEEIIIcQIkA63EEIIIYQQQggxAqTDLYQQQgghhBBCjADpcAshhBBCCCGEECPg/wfJ0UxODg/T/QAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "LightGBM表现最好的股票: 601916 (MSE: 0.000336)\n",
      "LightGBM表现最差的股票: 600519 (MSE: 277.720616)\n",
      "\n",
      "特征重要性分析 (以股票 600000 为例):\n",
      "LightGBM模型包含 230 个特征\n",
      "\n",
      "前10个最重要的特征:\n",
      "  1. 特征209: 510.00\n",
      "  2. 特征210: 152.00\n",
      "  3. 特征214: 78.00\n",
      "  4. 特征207: 52.00\n",
      "  5. 特征226: 48.00\n",
      "  6. 特征208: 48.00\n",
      "  7. 特征0: 38.00\n",
      "  8. 特征184: 37.00\n",
      "  9. 特征203: 36.00\n",
      "  10. 特征161: 35.00\n"
     ]
    }
   ],
   "source": [
    "# 分析损失分布\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "if len(stock_losses) > 0:\n",
    "    losses = list(stock_losses.values())\n",
    "\n",
    "    plt.figure(figsize=(12, 5))\n",
    "\n",
    "    # 损失分布直方图\n",
    "    plt.subplot(1, 2, 1)\n",
    "    plt.hist(losses, bins=20, alpha=0.7, color=\"lightgreen\", edgecolor=\"black\")\n",
    "    plt.title(\"各股票LightGBM模型MSE损失分布\")\n",
    "    plt.xlabel(\"MSE损失\")\n",
    "    plt.ylabel(\"股票数量\")\n",
    "    plt.grid(True, alpha=0.3)\n",
    "\n",
    "    # 损失排序图\n",
    "    plt.subplot(1, 2, 2)\n",
    "    sorted_losses = sorted(losses)\n",
    "    plt.plot(\n",
    "        range(len(sorted_losses)),\n",
    "        sorted_losses,\n",
    "        marker=\"o\",\n",
    "        markersize=3,\n",
    "        color=\"green\",\n",
    "    )\n",
    "    plt.title(\"各股票LightGBM模型MSE损失排序\")\n",
    "    plt.xlabel(\"股票序号（按损失排序）\")\n",
    "    plt.ylabel(\"MSE损失\")\n",
    "    plt.grid(True, alpha=0.3)\n",
    "\n",
    "    plt.tight_layout()\n",
    "\n",
    "    # 保存图像\n",
    "    plt.savefig(\n",
    "        os.path.join(OUTPUT_DIR, \"lightgbm_stock_losses_analysis.png\"),\n",
    "        dpi=300,\n",
    "        bbox_inches=\"tight\",\n",
    "    )\n",
    "    plt.show()\n",
    "\n",
    "    # 统计信息\n",
    "    data_points = list(stock_data_points.values())\n",
    "    print(f\"LightGBM损失统计信息:\")\n",
    "    print(f\"- 最小损失: {min(losses):.6f}\")\n",
    "    print(f\"- 最大损失: {max(losses):.6f}\")\n",
    "    print(f\"- 简单平均损失: {np.mean(losses):.6f}\")\n",
    "    print(f\"- 按数据点加权平均损失: {weighted_average_mse:.6f}\")\n",
    "    print(f\"- 损失标准差: {np.std(losses):.6f}\")\n",
    "    print(f\"- 损失中位数: {np.median(losses):.6f}\")\n",
    "\n",
    "    print(f\"\\n数据点统计信息:\")\n",
    "    print(f\"- 最小数据点数: {min(data_points)}\")\n",
    "    print(f\"- 最大数据点数: {max(data_points)}\")\n",
    "    print(f\"- 平均数据点数: {np.mean(data_points):.1f}\")\n",
    "    print(f\"- 总数据点数: {total_data_points}\")\n",
    "\n",
    "    # 计算MSE与数据点数量的关系\n",
    "    mse_vs_datapoints = [\n",
    "        (stock_data_points[code], stock_losses[code]) for code in stock_losses.keys()\n",
    "    ]\n",
    "    mse_vs_datapoints.sort()\n",
    "\n",
    "    # 添加数据点数量与MSE关系的图\n",
    "    plt.figure(figsize=(10, 6))\n",
    "    x_points = [x[0] for x in mse_vs_datapoints]\n",
    "    y_losses = [x[1] for x in mse_vs_datapoints]\n",
    "\n",
    "    plt.scatter(x_points, y_losses, alpha=0.6, s=50, color=\"green\")\n",
    "    plt.xlabel(\"数据点数量\")\n",
    "    plt.ylabel(\"MSE损失\")\n",
    "    plt.title(\"股票数据点数量与LightGBM MSE损失的关系\")\n",
    "    plt.grid(True, alpha=0.3)\n",
    "\n",
    "    # 添加趋势线\n",
    "    z = np.polyfit(x_points, y_losses, 1)\n",
    "    p = np.poly1d(z)\n",
    "    plt.plot(\n",
    "        x_points,\n",
    "        p(x_points),\n",
    "        \"r--\",\n",
    "        alpha=0.8,\n",
    "        label=f\"趋势线: y={z[0]:.2e}x+{z[1]:.4f}\",\n",
    "    )\n",
    "    plt.legend()\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.savefig(\n",
    "        os.path.join(OUTPUT_DIR, \"lightgbm_mse_vs_datapoints.png\"),\n",
    "        dpi=300,\n",
    "        bbox_inches=\"tight\",\n",
    "    )\n",
    "    plt.show()\n",
    "\n",
    "    # 找出损失最小和最大的股票\n",
    "    min_loss_stock = min(stock_losses.items(), key=lambda x: x[1])\n",
    "    max_loss_stock = max(stock_losses.items(), key=lambda x: x[1])\n",
    "\n",
    "    print(\n",
    "        f\"\\nLightGBM表现最好的股票: {min_loss_stock[0]} (MSE: {min_loss_stock[1]:.6f})\"\n",
    "    )\n",
    "    print(f\"LightGBM表现最差的股票: {max_loss_stock[0]} (MSE: {max_loss_stock[1]:.6f})\")\n",
    "\n",
    "    # 特征重要性分析（取第一个模型作为示例）\n",
    "    if len(stock_models) > 0:\n",
    "        sample_stock = list(stock_models.keys())[0]\n",
    "        sample_model_path = stock_models[sample_stock]\n",
    "        sample_model = lgb.Booster(model_file=sample_model_path)\n",
    "\n",
    "        print(f\"\\n特征重要性分析 (以股票 {sample_stock} 为例):\")\n",
    "        print(f\"LightGBM模型包含 {sample_model.num_feature()} 个特征\")\n",
    "\n",
    "        # 获取特征重要性\n",
    "        importance = sample_model.feature_importance(importance_type=\"split\")\n",
    "        feature_names = [f\"feature_{i}\" for i in range(len(importance))]\n",
    "\n",
    "        # 显示前10个最重要的特征\n",
    "        top_indices = np.argsort(importance)[-10:][::-1]\n",
    "        print(\"\\n前10个最重要的特征:\")\n",
    "        for i, idx in enumerate(top_indices):\n",
    "            print(f\"  {i+1}. 特征{idx}: {importance[idx]:.2f}\")\n",
    "\n",
    "else:\n",
    "    print(\"没有成功训练的LightGBM股票模型\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c24af8e7",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
